# [Algorithm/JS] 프로그래머스 42888 오픈채팅방

🔗 문제 바로가기 (opens new window)

# 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

나의 풀이는 logged 객체를 생성해 아래와 같은 형태로 저장했다.

이미 해당 uid 키가 있을 경우 최종적으로 저장되는 마지막 name으로 덮어쓰기가 된다.

{
	[uid]: name
}
1
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

이번에는 Enter, Leave 와 같은 상태를 action 에 객체로 담아 사용했다.

Change 의 경우를 제외하고 answer 에 유저아이디와 상태를 push 한다.

그리고 위에서 실패했던 원인인 Leave 상태를 제외하고 logged 객체에 닉네임을 업데이트해준다.

값을 반환할 때는 map을 사용하여 logged 와 action 에서 찾아 출력했다.

성공!

Last Updated: 2022. 6. 5. 오후 3:42:39