It's easy, if you try

[프로그래머스] 오픈채팅방 (Java) - 2019 KAKAO BLIND RECRUITMENT / 자료구조 본문

알고리즘/자바(Java)

[프로그래머스] 오픈채팅방 (Java) - 2019 KAKAO BLIND RECRUITMENT / 자료구조

s5he2 2021. 6. 6. 15:54
반응형

문제

 

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

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

programmers.co.kr

 

풀이

첫번째 풀이

import java.util.*;

// queue에는 uid, true/false 를 넣는다.
// user는 HashMap<uid, nickName>.

class Solution {
    public String[] solution(String[] record) {
        Queue<HashMap<String, Boolean>> queue = new LinkedList<>();
        HashMap<String, String> user = new HashMap<>();
        int recordLen = record.length;
        for(String r : record) {
            String oper = r.split(" ")[0];
            String uid = r.split(" ")[1];
            String nickName = "";
            if(!oper.equals("Leave"))
                nickName = r.split(" ")[2];
            HashMap<String, Boolean> temp = new HashMap<>();
            switch(oper) {
                case "Enter":
                    user.put(uid, nickName); // 유저가 들어옴
                    temp.put(uid, true); // 유저가 들어옴
                    queue.offer(temp);
                    break;
                case "Leave":
                    temp.put(uid, false); // 유저가 나감
                    queue.offer(temp);
                    break;
                case "Change":
                    user.replace(uid, nickName); // 유저 닉네임 변경
                    recordLen--;
                    break;
            }
        }
        
        
        String[] answer = new String[recordLen];
        int i=0;
        while(!queue.isEmpty()) {
            HashMap<String, Boolean> temp = queue.poll();
            String uid = "";
            for(String key: temp.keySet()) 
                uid = key;
            if(temp.get(uid)){ // 들어왔습니다.
                answer[i] = user.get(uid) +"님이 들어왔습니다.";
            } else {
                answer[i] = user.get(uid)+"님이 나갔습니다.";
            }
            i++;
        }
        
        return answer;
    }
}

queue를 이용해서 해당 아이디가 들어오고 나간 내역을 저장했다.

HashMap에서는 Enter일 땐 유저id와 닉네임을 put하고, Change일 땐 해당 유저 id의 닉네임을 replace했다.

그러나 queue에 해시맵을 생성하고 offer하는 과정과 poll해서 사용하는 과정이 복잡했다. 이를 아주 간단하게 해결할 수 있었다.(두번째 풀이)

두번째 풀이

그냥 record 배열을 두번 반복하면 queue를 사용하지 않아도 된다. 

  • 첫번째 반복에서는 유저가 들어오는 것과, 닉네임을 변경하는 것만 처리한다. 그럼 HashMap 마지막 상태는 유저아이디에 해당하는 최종 닉네임만 남아있다. (유저 닉네임이 변경되면 들어왔습니다의 닉네임도 변경되기 때문에 이 작업이 중요하다.)
  • 두번째 반복에서는 Enter일 땐, HashMap 유저아이디의 최종 닉네임이 들어왔습니다를 answer에 할당하고, Leave일 땐, 나갔습니다를 할당하면 된다.
import java.util.*;

class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> user = new HashMap<>();
        String oper="";
        String uid="";
        String nickName="";
        int recordLen = record.length;
        
        for(String r : record) {
            oper = r.split(" ")[0];
            uid = r.split(" ")[1];
            if(!oper.equals("Leave"))
                nickName = r.split(" ")[2];
            switch(oper) {
                case "Enter":
                    user.put(uid, nickName); // 유저가 들어옴
                    break;
                case "Change":
                    user.replace(uid, nickName); // 유저 닉네임 변경
                    recordLen--;
                    break;
            }
        }
        
        
        String[] answer = new String[recordLen];
        int i=0;
        for(String r: record) {
            oper = r.split(" ")[0];
            uid = r.split(" ")[1];
            switch(oper) {
                case "Enter":
                    answer[i++] = user.get(uid)+"님이 들어왔습니다.";
                    break;
                case "Leave":
                    answer[i++] = user.get(uid)+"님이 나갔습니다.";
                    break;
            }
        }
        return answer;
    }
}
반응형
Comments