프로그래머스 2019 KAKAO BLIND RECRUITMENT Level 2 문제 오픈채팅방을 Java를 이용해 풀어보았다.
HashMap을 이용해 간단히 풀 수 있는 문제였다. 다른 사람들의 풀이를 보니 매우 다양하던데 결국 원리는 다 같은 것 같아서 내 풀이에서 더 수정하지는 않았다.
문제 링크 첨부한다.
https://programmers.co.kr/learn/courses/30/lessons/42888
앞서 어떤 닉네임으로 들어왔든지 마지막에 어떤 닉네임을 갖고 있느냐가 중요하기 때문에 HashMap을 이용해 특정 ID에 매핑되는 닉네임 값을 가지는 데이터를 저장해주자.
즉, 들어올 때의 닉네임을 보존해줄 필요없이 마지막 순간에 어떤 닉네임인지가 중요한 것이다. 다음 그림으로 이해해보자.들어올 때는 uid1234
가 Muzi
라는 닉네임이지만, 마지막에는 Prodo
라는 닉네임을 가진다.
이를 위해 명령어가 Enter
과 Change
일 때 map에 put(uid, name)
을 수행해주면 된다. 세 가지 명령어 Enter, Change, Leave
는 action
이라는 변수로 명명해주었다.
이를 코드로 표현하면 다음과 같다.
switch(action){
case "Enter": // action1
uidName.put(uid, name);
break;
case "Change": // action3
uidName.put(uid, name);
break;
}
앞서 완성한 HashMap은 uid
에 따른 name
정보였다.
그렇다면 이제 실제로 메시지를 생성하기 위해 들어오고 나가는 명령을 저장해주기 위한 작업이 필요하다.
이 경우에는 uid
+ action
정보를 저장해주면 된다. action
에 저장해줄 정보는 오직 Enter
과 Leave
두 개만 저장해주면 된다. 실제 출력될 메시지는 나가고 들어오는 것만 표시해주기 때문이다. 이때 Enter
은 1
, Leave
는 2
로 표시해준다.
그림으로 표시하면 다음과 같다.이에 따라 출력될 메시지를 추가해주면 된다.
먼저 위의 정보를 LinkedList<String[]> uidAction
에 저장해주자. 이를 코드로 표현하면 다음과 같다.
switch(action){
case "Enter": // action1
uidAction.add(new String[]{uid, "1"});
break;
case "Leave": // action2
uidAction.add(new String[]{uid, "2"});
break;
}
위 정보를 저장해주고 메시지를 생성하는 과정은 다음과 같다.
String[] answer = new String[uidAction.size()];
int msgIdx = 0;
for(String[] msg: uidAction){
String uid = msg[0];
int actionNum = Integer.parseInt(msg[1]);
switch(actionNum){
case 1: // 입장
answer[msgIdx] = uidName.get(uid) + "님이 들어왔습니다.";
break;
case 2: // 퇴장
answer[msgIdx] = uidName.get(uid) + "님이 나갔습니다.";
break;
}
msgIdx++;
}
uidAction
에 몇 번 action
이 저장됐는지에 따라서 switch
문을 따라가면 된다.
위의 모든 코드를 합쳐 작성하면 다음과 같다. 내가 제출한 코드다.
import java.util.HashMap;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class OpenChat {
static HashMap<String, String> uidName = new HashMap<>();
static LinkedList<String[]> uidAction = new LinkedList<>(); // Enter:1, Leave:2, Change:3
static String[] solution(String[] record) {
operateOrder(record);
String[] answer = new String[uidAction.size()];
int msgIdx = 0;
for(String[] msg: uidAction){
String uid = msg[0];
int actionNum = Integer.parseInt(msg[1]);
switch(actionNum){
case 1: // 입장
answer[msgIdx] = uidName.get(uid) + "님이 들어왔습니다.";
break;
case 2: // 퇴장
answer[msgIdx] = uidName.get(uid) + "님이 나갔습니다.";
break;
}
msgIdx++;
}
return answer;
}
static void operateOrder(String[] record){
for(String order: record){
StringTokenizer stk = new StringTokenizer(order);
String action = stk.nextToken();
String uid = stk.nextToken();
switch(action){
case "Enter": // action1
uidName.put(uid, stk.nextToken());
uidAction.add(new String[]{uid, "1"});
break;
case "Leave": // action2
uidAction.add(new String[]{uid, "2"});
break;
case "Change": // action3
uidName.put(uid, stk.nextToken());
break;
}
}
}
public static void main(String args[]) {
String[] record = { "Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan" };
String[] result = solution(record);
for(String line: result) System.out.println(line);
}
}
HashMap을 이용해 쉽게 해결이 가능한 문제였다.