문제

https://programmers.co.kr/learn/courses/30/lessons/42888


코드

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

private static final String ENTER = "Enter";
private static final String LEAVE = "Leave";
private static final String CHANGE = "Change";

private static final String MESSAGE_ENTER = "님이 들어왔습니다.";
private static final String MESSAGE_LEAVE = "님이 나갔습니다.";

public String[] solution(String[] record) {
List<String[]> list = new ArrayList<>();
Map<String, String> nickName = new HashMap<>();

int returnArraySize = 0;
for (String s : record) {
String[] split = s.split(" ");
String[] actionAndUid = new String[3];

actionAndUid[0] = split[0];
actionAndUid[1] = split[1];

if (!CHANGE.equals(split[0])) {
list.add(actionAndUid);
returnArraySize++;
}

if (!LEAVE.equals(split[0])) {
nickName.put(split[1], split[2]);
}
}

String[] answer = new String[returnArraySize];
int i = 0;
for (String[] array : list) {
switch (array[0]) {
case ENTER :
answer[i] = nickName.get(array[1]) + MESSAGE_ENTER;
break;
case LEAVE :
answer[i] = nickName.get(array[1]) + MESSAGE_LEAVE;
break;
}

i++;
}

return answer;
}

흐름

  1. 문자열을 공백으로 나눠서 행동과 유저의 아이디를 저장하는 배열에 담는다.
  2. 행동이 Change가 아닌 경우엔 채팅방에 입장했거나 나갓다는 문구룰 출력해야 하기 때문에 List에 담는다.
  3. 행동이 Leave가 아닌 경우엔 닉네임이 변경되었거나, 새로 방에 들어온 것이므로 유저 아이디를 key로하는 map에 value로 닉네임을 저장한다.
  4. 모두 저장했으면 List만큼 돌면서 해당 행동에 맞는 문자열을 만들어 저장한다.

결과

번호 속도
테스트 1 통과 (18.70ms, 54.1MB)
테스트 2 통과 (17.35ms, 52.4MB)
테스트 3 통과 (17.84ms, 54.4MB)
테스트 4 통과 (19.81ms, 54MB)
테스트 5 통과 (27.75ms, 56.1MB)
테스트 6 통과 (30.38ms, 56.1MB)
테스트 7 통과 (35.26ms, 54.4MB)
테스트 8 통과 (27.59ms, 55.2MB)
테스트 9 통과 (30.72ms, 56.5MB)
테스트 10 통과 (28.67ms, 56.1MB)
테스트 11 통과 (25.16ms, 56.2MB)
테스트 12 통과 (26.04ms, 56.6MB)
테스트 13 통과 (26.07ms, 55MB)
테스트 14 통과 (43.84ms, 57.2MB)
테스트 15 통과 (20.35ms, 52.4MB)
테스트 16 통과 (18.03ms, 52.8MB)
테스트 17 통과 (19.77ms, 54.2MB)
테스트 18 통과 (18.86ms, 52.5MB)
테스트 19 통과 (35.94ms, 56.7MB)
테스트 20 통과 (26.22ms, 55.5MB)
테스트 21 통과 (30.18ms, 56.5MB)
테스트 22 통과 (28.53ms, 52.5MB)
테스트 23 통과 (29.40ms, 57.5MB)
테스트 24 통과 (37.73ms, 57.3MB)
테스트 25 통과 (262.95ms, 158MB)
테스트 26 통과 (292.57ms, 158MB)
테스트 27 통과 (333.29ms, 169MB)
테스트 28 통과 (324.94ms, 163MB)
테스트 29 통과 (282.87ms, 157MB)
테스트 30 통과 (286.21ms, 153MB)
테스트 31 통과 (225.37ms, 147MB)
테스트 32 통과 (255.96ms, 137MB)

테스트 케이스

1
2
3
String[] actual = {"Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"};
String[] expected ={"Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."};
assertArrayEquals(expected, test.solution(actual));