알고리즘 풀이(Problem Solving)/자료구조

알고리즘 풀이 - 프로그래머스(오픈채팅방(Lv 2), 리스트/맵)

jjong1991 2021. 7. 9. 22:21
반응형

 

관련글

 

ArrayList 직접 구현 관련 포스팅은 여기를 참조
Map 관련 포스팅은 여기(1번, 2번)를 참조

 

 

1. 개요

 

문제의 링크는 여기를 참조

 

문제의 내용은 아래의 더보기를 클릭하여 참조

 

채팅방에 입장 / 퇴장 시에 출력되는 문자들을 문자열 배열로 추가하여 반환하는 문제(닉네임 변경 시, 이전 문자열의 닉네임도 변경된다.)

 

 

2. 풀이

 

우선 다음과 같이 정리 된다.

① 채팅방에 문자열이 출력되는 경우
  - 채팅방에 입장했을 때("OOO님이 들어왔습니다.")
  - 채팅방을 퇴장했을 때("OOO님이 나갔습니다.")

② 닉네임이 변경되는 경우
  - 채팅방에서 변경 시(Change)
  - 퇴장 후, 재 입장할 때(Leave - Enter)

 

여기서 주의할 점은 A가 입장 시 OOO으로 들어왔고, 퇴장 후 다시 입장했을 때 닉네임이 XXX였다면, 기존 "OOO님이 들어왔습니다." 라는 문구 또한 "XXX님이 들어왔습니다." 로 바뀌어야 한다는 것이다.

 

따라서, 여기서 다음과 같은 2가지 자료구조를 사용하였다.

① Map(HashMap)
  - 입장한 모든 인원과 닉네임을 매칭시키는 키-데이터 자료 구조
  - 라이브러리 사용

② ArrayList
  - 입장 / 퇴장 명령어 리스트를 저장함. 이후 닉네임과 매칭시켜 출력될 문자열을 저장함
  - 직접 구현함

 

 

3. 코드

 

아래의 코드를 통해 정답을 알아보자.

import java.util.*;
class Solution {
    public String[] solution(String[] record) {
        MyList list = new MyList();  // 직접 구현한 ArrayList
        
        Map<String, String> map = new HashMap<>(); // 유저 - 닉네임 매칭 저장을 위한 Map
        for(String s : record){
            String[] sr = s.split(" ");
            if(sr[0].equals("Enter") || sr[0].equals("Leave")) list.add(sr[0] + " " + sr[1]); // 명령 별도로 인입
            if(sr[0].equals("Enter") || sr[0].equals("Change")) map.put(sr[1], sr[2]);  // 이름 변경
        }

        // 입장 / 퇴장 이력만 사용하여 결과 값 저장
        String[] eff_record = list.toArray();
        String[] answer = new String[eff_record.length];
        int idx = 0;
        for(String rec : eff_record){
            String[] sr = rec.split(" ");
            if(sr[0].equals("Enter")) answer[idx] = map.get(sr[1]) + "님이 들어왔습니다.";
            else answer[idx] = map.get(sr[1]) + "님이 나갔습니다.";
            idx++;
        }
        return answer;
    }
}
// 직접 구현한 ArrayList
class MyList{
    String[] arr = new String[16];
    int size = 0;
    public void add(String s){
        if(arr.length == size+1) makeDouble();
        arr[size++] = s;
    }
    public void makeDouble(){
        String[] tmp = new String[size];
        System.arraycopy(arr, 0, tmp, 0, size);
        arr = new String[size*2];
        System.arraycopy(tmp, 0, arr, 0, size);
    }
    public String[] toArray(){
        String[] ret = new String[size];
        for(int i=0; i < size; i++){
            ret[i] = arr[i];
        }
        return ret; 
    }
}

 

 

읽어주셔서 감사합니다. 오류가 있으면 지적해주시면 반영하겠습니다.

반응형