[문제설명]
문제가 너무 길어서 생략하겠습니다..😇
[제한 조건]
마찬가지로 너무 길어서 생략..😇
[나의 풀이]
// HashMap, ArrayList, Switch문 적극 이용
// user라는 맵에 uid를 key로 nickname을 value로 저장
// action이라는 ArrayList에 {log, uid}라는 String[]을 시간 순서대로 저장
// 정답결과는 action의 원소를 하나씩 빼와서 log를 기준으로 어떤 행동인지 파악하고,
// uid를 이용하여 user맵에서 최신으로 업데이트된 nickname을 가져와서 정답배열의 원소를 조합
import java.util.*;
public class 오픈채팅방 {
static Map<String, String> user = new HashMap<>();
static List<String[]> action = new ArrayList<>();
public String[] solution(String[] record) {
for (String e : record) {
String[] s = e.split(" ");
switch(s[0]) {
case "Enter" :
Enter(s);
break;
case "Leave" :
Leave(s);
break;
case "Change" :
Change(s);
break;
}
}
String[] answer = new String[action.size()];
for (String[] e : action) {
int idx = action.indexOf(e);
String log = e[0];
String nickname = user.get(e[1]);
StringBuffer sb = new StringBuffer();
switch(log) {
case "0" :
sb.append(nickname);
sb.append("님이 들어왔습니다.");
answer[idx] = sb.toString();
break;
case "1" :
sb.append(nickname);
sb.append("님이 나갔습니다.");
answer[idx] = sb.toString();
break;
}
}
return answer;
}
public static void Enter(String[] s) { // enter의 log는 0
// 만약 들어왔는데 기존에 들어왔던 기록이 있는 사람이라면,
// change함수 실행
String uid = s[1];
String nickname = s[2];
user.put(uid, nickname);
action.add(new String[] {"0", uid}); // log uid
}
public static void Leave(String[] s) { // leave의 action은 1
String uid = s[1];
String nickname = user.get(s[1]);
action.add(new String[] {"1", uid}); // log uid
}
public static void Change(String[] s) { // change의 action은 기록하지 않는다.
String uid = s[1];
String nickname = s[2];
user.put(uid, nickname);
}
public static void main(String[] args) {
오픈채팅방 answer = new 오픈채팅방();
// System.out.println("answer.solution() = " + answer.solution());
}
}
위 코드와 같이 작성해보았다.
HashMap, ArrayList를 이용하여 풀이해보았고, 이번에는 "Enter", "Leave", "Change"와 같은 여러 Command가 있어, Switch문을 이용해보았다.
주어진 record배열의 원소를 split하여, 각 command에 어울리는 함수를 switch문을 이용하여 호출하도록 하였다...
user라는 맵에 uid를 key로 nickname을 value로 저장하도록 하였고, action이라는 ArrayList에 {log, uid}라는 String[]을 시간 순서대로 저장시켜주었다.
정답결과는 action의 원소를 하나씩 빼와서 log를 기준으로 어떤 행동인지 파악하고, uid를 이용하여 user맵에서 최신으로 업데이트된 nickname을 가져와서 정답배열의 원소를 조합하고 리턴시키도록 하였다.
(작성할때는 간결해보였으나, 완성하고 보니 좀 많이 긴 느낌..☹️)
LV2와 카카오 문제치고는 문제에서 요구하는대로 구현하면 무난히 맞출 수 있는 문제였던 것 같다. 다만, 주의할 점은 최대한 불필요한 연산, 반복을 줄여서 시간초과를 피하자.
아래는 채점결과이다.