본문 바로가기
algorithm

[JAVA] 오픈채팅방 (2019 kakao 프로그래머스)

by onejunu 2020. 8. 25.

 

 

 

문제의 핵심은 "마지막에 바꾼 닉네임이 진짜 닉네임" 이라는 것이다.

 

만약 record의 리스트가 아래처럼 주어졌다고 가정하자.

 

ex) record

["Enter id1 A","Enter id2 B","Leave A","Enter id1 B", "Change id2 C"]

 

그리고 비어있는 HashMap<String,String> 초기화 한다. 이유는 고유한 아이디마다 하나의 닉네임을 결국에 가지게 될것이기 때문이다.

 

뒤에서 부터 아이디가 HashMap에 있는지 검색하고 없으면 추가한다.

 

record 의 크기가 5이므로 뒤에서 부터 총 5번의 과정에서 HashMap이 어떻게 변화하는지 보자.

 

1) { "id2":"C" }

2) {"id1":"B","id2":"C"}

3) {"id1":"B","id2":"C"}

4) {"id1":"B","id2":"C"}

5) {"id1":"B","id2":"C"}

 

결국 "id1"의 닉네임은 "B" 이며 "id2"의 닉네임은 "C" 이다.

 

이제 고유한 아이디 한개당 닉네임을 알아냈으니 record를 처음부터 탐색하면서 문제 조건대로 출력해주면 된다.

 

 

2번 루프로 끝낼 수 있고 최대 record의 길이는 100000이므로 시간복잡도는 충분하다.

 

<전체코드>

 

import java.util.*;
class Solution {
    
        StringTokenizer st = new StringTokenizer("");
        HashMap<String,String> idToName = new HashMap<>();

        public String[] solution(String[] record) {
            for(int i=record.length-1;i>=0;i--){
                st = new StringTokenizer(record[i]);
                if(st.nextToken().equals("Leave")) continue;
                String id = st.nextToken(), name = st.nextToken();
                if(!idToName.containsKey(id)) idToName.put(id,name);
            }
            ArrayList<String> ans = new ArrayList<>();
            String in = "님이 들어왔습니다.";
            String out = "님이 나갔습니다.";

            for(int i=0;i<record.length;i++){
                st = new StringTokenizer(record[i]);
                String s = st.nextToken();
                if(s.equals("Enter")) ans.add(idToName.get(st.nextToken())+in);
                else if(s.equals("Leave")) ans.add(idToName.get(st.nextToken())+out);
            }
            return ans.toArray(new String[ans.size()]);

        }
    }

댓글