[Java] 프로그래머스(level-2) - 오픈채팅방
문제 풀이
이 문제는 HashMap을 활용하면 풀 수 있는 간단한 문제이다.
아이디어 도출
문제를 살펴보면, 출력해야하는 채팅방 관리 기록은 사용자마다 가장 최신의 닉네임을 반영하고 있다. 여기서 바로 HashMap을 활용해 사용자마다 최신의 닉네임을 갱신해두면 된다는 것을 알 수 있다.
사용자마다 갱신한 닉네임을 구한다면 입장하는 Enter
, 퇴장하는 Leave
마다 해당 닉네임으로 기록을 남기면 된다.
그래서 결국 닉네임을 갱신하는 순회와 기록을 남기는 순회까지 총 O(2N)의 시간복잡도를 가지도록 구현하면 된다.
- record 배열을 순회하며,
Enter
일 경우, HashMap에 사용자를 key로, 닉네임을 value로 삽입한다. Change
일 경우, HashMap에 사용자를 key로, 닉네임을 value로 삽입하여 사용자의 닉네임을 갱신한다.- 다시 record 배열을 순회하며
Enter
일 경우 hashMap의 닉네임으로 입장 기록을 남기고,Leave
일 경우 hashMap의 닉네임으로 퇴장 기록을 남긴다.
문제 풀이를 위해 작성한 코드는 아래와 같다.
작성 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.*;
class Solution {
public String[] solution(String[] record) {
HashMap<String, String> userMap = new HashMap<>();
for(String input : record) {
String[] split = input.split(" ");
if(split[0].equals("Enter")) {
userMap.put(split[1], split[2]);
}
else if(split[0].equals("Change")) {
userMap.put(split[1], split[2]);
}
}
ArrayList<String> result = new ArrayList<>();
for(String input : record) {
String[] split = input.split(" ");
if(split[0].equals("Enter")) {
result.add(userMap.get(split[1]) + "님이 들어왔습니다.");
}
else if(split[0].equals("Leave")) {
result.add(userMap.get(split[1]) + "님이 나갔습니다.");
}
}
String[] answer = new String[result.size()];
for(int i=0; i<result.size(); i++) {
answer[i] = result.get(i);
}
return answer;
}
public static void main(String[] args) {
Solution sol = new Solution();
String[] record = new String[]{"Enter uid1234 Muzi",
"Enter uid4567 Prodo",
"Leave uid1234",
"Enter uid1234 Prodo",
"Change uid4567 Ryan"};
sol.solution(record);
}
}
회고
출처
- —
- 해당 문제의 저작권은 문제를 만든이에게 있으며 자세한 내용은 문제 링크에서 참조바랍니다.