## 🌟 문제 [코딩테스트 연습 - 오픈채팅방 \| 프로그래머스 스쿨](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)이다.