# [Algorithm/JS] 프로그래머스 42888 오픈채팅방
# Solution
# 실패 풀이
1번, 16번 케이스를 제외하고 모두 실패했다.
function solution(record) {
var answer = [];
const logged = {};
record.map((log) => {
const [action, uid, name] = log.split(' ');
if (action === 'Enter') answer.push([uid, '님이 들어왔습니다.']);
if (action === 'Leave') answer.push([uid, '님이 나갔습니다.']);
logged[uid] = name;
});
return answer.map((a) => logged[a[0]] + a[1]);
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
나의 풀이는 logged
객체를 생성해 아래와 같은 형태로 저장했다.
이미 해당 uid 키가 있을 경우 최종적으로 저장되는 마지막 name으로 덮어쓰기가 된다.
{
[uid]: name
}
1
2
3
2
3
마지막으로 map 을 통해 출력했다.
한참동안 실패 원인을 찾이 못했는데 여기서 문제의 지문을 잘 읽어보자.
채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두가지이다.
- 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
- 채팅방에서 닉네임을 변경한다.
닉네임을 변경하는 것은 채팅방에 Enter
했을 때와 Change
를 했을 경우다.
그렇다면 Leave
를 했을 경우에는 유저 아이디의 이름이 변경되지 않아야 한다.
성공한 코드를 보자.
# 성공 풀이
function solution(record) {
let answer = [];
let logged = {};
let action = {
Enter: '님이 들어왔습니다.',
Leave: '님이 나갔습니다.',
};
record.map((log) => {
const [state, uid, name] = log.split(' ');
if (state !== 'Change') answer.push([uid, state]);
if (state !== 'Leave') logged[uid] = name;
});
return answer.map((a) => logged[a[0]] + action[a[1]]);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
이번에는 Enter, Leave 와 같은 상태를 action 에 객체로 담아 사용했다.
Change
의 경우를 제외하고 answer
에 유저아이디와 상태를 push
한다.
그리고 위에서 실패했던 원인인 Leave 상태를 제외하고 logged
객체에 닉네임을 업데이트해준다.
값을 반환할 때는 map을 사용하여 logged 와 action 에서 찾아 출력했다.
성공!