본문으로 바로가기
반응형

 

관련글

 

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; 
    }
}

 

 

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

반응형