2019 KAKAO BLIND RECRUITMENT 오픈채팅방

문제 이해

문자열 N개가 주어질 것이다.
이 때 문자열은 3가지 방식으로 입력된다.
1. Enter + 아이디 + 이름
2. Leave + 아이디
3. Change + 아이디 + 이름

Enter 구문이 입력으로 들어왔을 경우 "{이름}님이 들어왔습니다", Leave 구문이 입력으로 들어왔을 경우 "{이름}님이 나갔습니다."를 출력해야 한다.

Change 구문이 들어왔으면 해당 아이디에 저장되어 있던 이름이 모두 바뀌어야 하는데, 이 때 Enter나 Leave구문이 미리 입력되었을 경우 해당 문장의 이름 또한 바뀌어야 한다.
그리고 똑같은 id를 가진 Enter구문이 2번 이상 들어왔을 경우 들어왔다는 구문은 모두 출력하되 이름은 가장 나중에 들어온 Enter 구문으로 모두 변경되어어야 한다.

이 때 최종적으로 출력되는 구문을 반환하라


문제 풀이

문제의 이해가 어려웠던 것이지, 문제 이해만 잘하면 매우 쉬웠던 문제이다.
Enter 구문이 N번 중복되면 가장 마지막에 있는 이름으로 바꾸고, Change로 아이디에 대응하는 이름이 변경되면 해당 아이디로 Enter, Leave 했던 출력구문의 이름을 변경시키면 되는 것이다.
즉, ID는 변하지 않지만 이름은 변경되는 것이고, 자연스럽게 Map 자료구조를 활용하면 될 것이라는 생각이 들었다.

Key 값을 ID로 지정하고, map.put({id}, {이름})을 매 Change, Enter 구문에 수행시켜준다면 id가 존재할 경우 이름이 바뀔 것이며, 존재하지 않을 경우 새로운 id가 추가될 것이다.
(ID가 없는데 Change가 발생하지는 않는다는 제한 조건이 있으므로, 이런 방식을 활용해도 문제가 없다)

따라서, "{이름}님이 나갔습니다"처럼 문구를 만들지 말고 먼저 "{id}님이 나갔습니다"처럼 문구를 만든 뒤, map.get({id})를 통해서 최종적으로 해당 id의 Value로 저장된 이름 값을 가지고 와 문구를 생성하면 될 것이다


코드

import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        String[] answer = {};
        Map<String, String> id = new HashMap<>();
		Queue<String> queue = new LinkedList<>();
        
        for(int i =0;i<record.length;i++){
            String[] str = record[i].split(" ");
            
            if(str.length==3){
            // Enter구문이나 Change구문
            // Map에 ID와 대응하는 이름을 넣어준다.
                id.put(str[1], str[2]);
                if(!str[0].equals("Change")){
                /*
                Change일 경우 문구가 출력되지 않는다.
                Queue는 최종적으로 출력될 문구에 관련된 자료구조이므로, 
                Change일 때는 이 메서드가 수행되서는 안된다
                */
                    queue.add(str[1]);
                    queue.add(str[0]);
                }
            }
            else{
                queue.add(str[1]);
                queue.add(str[0]);
            }
            // queue에 저장된 str[1] : ID, str[0] : Enter나 Leave

        }
        
        ArrayList<String> sb = new ArrayList<>();
        while(!queue.isEmpty()){
            String who = queue.poll();
            // ID값이 Pop된다(str[1], 즉 ID값을 먼저 넣었으므로 FIFO 구조에
            // 의해 ID 값이 먼저 반환된다)
            String in = queue.poll();
            // 해당 ID값이 수행하는 행동(Enter나 Leave)가 출력될 것이다
            
            if(in.equals("Enter")){
            // Enter Case
            // Map에서 id에 대응하는 이름을 꺼내온 뒤 들어왔습니다 문구에 추가
                sb.add(id.get(who)+"님이 들어왔습니다.");
            }
            else{
            // Leave Case
                sb.add(id.get(who)+"님이 나갔습니다.");
            }
        }
        
        return sb.toArray(new String[sb.size()]);

    }
}

결과

좋은 웹페이지 즐겨찾기