## 🌟 문제
[코딩테스트 연습 - 오픈채팅방 \| 프로그래머스 스쿨](https://school.programmers.co.kr/learn/courses/30/lessons/42888)
오픈 채팅방에서 유저들은 입장/퇴장/닉네임 변경을 할 수 있다. 입장/퇴장시에는 메시지가 뜨는데 닉네임을 변경하면 기존 메시지의 닉네임도 모두 변경된다. 모든 기록이 처리된 뒤에 최종적으로 보이는 메세지 목록을 구하는 문제.
## 🌟 풀이
닉네임이 변경되면 과거 모든 메시지의 닉네임도 함께 변경된다는 점이 중요하다. 즉 최종적으로 보이는 메시지에는 각 유저의 최종 닉네임만 표시되기 때문에, 우선 최종 닉네임을 구한 뒤에 메시지 목록을 만들어줘야 한다.
### 1단계 : 최종 닉네임 구하기
record를 순회하면서 Enter나 Change가 발생할 때마다 해당 uid의 닉네임을 업데이트해줬다. Map은 같은 키에 값을 넣으면 덮어쓰기 되기 때문에 순회가 끝나면 자연스럽게 각 uid의 최종 닉네임이 저장된다.
```javascript
const userMap = new Map();
for (let idx = 0; idx < record.length; idx++) {
const [type, uid, name] = record[idx].split(' ');
if (type === "Enter" || type === "Change") {
userMap.set(uid, name);
}
}
```
### 2단계 : 메시지 목록 생성
record를 다시 순회하면서 Enter나 Leave에 대해서만 메시지를 생성한다. 이 때 닉네임 부분은 userMap에 저장되어 있는 최종 닉네임을 사용한다.
```javascript
const answer = [];
for (let idx = 0; idx < record.length; idx++) {
const [type, uid, _] = record[idx].split(' ');
if (type === "Enter") answer.push(`${userMap.get(uid)}님이 들어왔습니다.`);
else if (type === "Leave") answer.push(`${userMap.get(uid)}님이 나갔습니다.`);
}
```
> **시간 복잡도**
> N이 record 배열의 길이일 때 record를 두 번 순회하기 때문에 O(N)이다.