반응형
05-15 00:00
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[Programmers] 오픈채팅방 본문

Programming/프로그래머스

[Programmers] 오픈채팅방

조용한고라니 2021. 5. 11. 14:46
반응형

2019 KAKAO BLIND RECRUITMENT

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr


[Map, Queue 및 구현]

카카오다운 문제인 것 같다. 사용자의 고유 ID를 중심으로 사용자의 닉네임을 매칭해야하기 때문에 ID 값에 따른 닉네임을 수시로 변경할 수 있어야한다. 이에 적합한 컬렉션으로 Map이 있다. Map은 <Key, Value>를 데이터로 저장하는 자료구조이므로 고유한 Key (ID), 그에 따른 Value(name)을 저장하면 되겠다.

 

나는 각 Record를 처리하며 그의 결과를 Queue에 저장하였다. 그렇게 하면 결과값으로 출력해야할 "...님이 들어왔습니다." 및 "...님이 나갔습니다." 를 순서대로 출력할 수 있기 때문이다. 제출해야 할 답안은 최종적으로 각 ID가 갖는 닉네임으로 저장하여야 하기 때문에 모든 Record를 돌고난 후에 처리했다.

# Code </>

import java.util.*;

class Solution {

    static class Data{
        String uid;
        int sen;
        
        public Data(String uid, int sen){
            this.uid = uid;
            this.sen = sen;
        }
    }

    static Map<String, String> map = new HashMap<>();
    static Queue<Data> Q = new LinkedList<>();

    static char[] commands = {'E', 'L', 'C'};
    static String[] sentenses = {"님이 들어왔습니다.", "님이 나갔습니다."};

    public String[] solution(String[] records) {

        for(String record : records){
            StringTokenizer st = new StringTokenizer(record);

            int cmd = -1;
            char initial = st.nextToken().charAt(0);

            /* cmd --> 0: Enter, 1: Leave, 2: Change */
            for(int i=0; i<3; i++)
                if(initial == commands[i])
                    cmd = i;

            String uid = st.nextToken();
            String name = null;

            /* Leave일 때는 name이 없음 */
            if(cmd != 1) {
                name = st.nextToken();

                if (!map.containsKey(uid))
                    map.put(uid, name);
                else
                    map.replace(uid, name);
            }

            System.out.println(cmd + ", " + uid + ", " + name);

            switch (cmd){
                case 0:
                    Q.add(new Data(uid, 0)); //(uid, "님이 들어왔습니다.")
                    break;
                case 1:
                    Q.add(new Data(uid, 1)); //(uid, "님이 나갔습니다.")
                    break;
            }
        }

        /* Queue의 사이즈 만큼 문장이 실행될 것 */
        int n = Q.size();
        String[] answer = new String[n];

        for(int i=0; i<n; i++){
            Data data = Q.poll();
            String name = map.get(data.uid);

            answer[i] = name + sentenses[data.sen];
        }

        return answer;
    }
}
반응형
Comments