해당 포스팅은 프로그래머스 오픈채팅방 풀이를 다룬다. 문제 링크
코드는 javascript로 작성하였으며 구현 문제이다.
채팅방 기록은 Enter와 Leave만 남는다. Change는 기록에 남지 않는다.
따라서 Enter와 Leave일 때만 배열(answer)에 넣어준다.
닉네임이 바뀌면 이전의 채팅방 기록의 닉네임을 변경해주어야 한다.
따라서 아이디와 닉네임은 해시(user)로 관리하고, 채팅방 기록을 넣는 배열에는 아이디값과 입장/퇴장 시 출력하는 문구를 배열로 넣어준다.
Enter와 Change일 때마다 유저 아이디 key의 value(닉네임)를 설정한다. 이전에 등록되지 않은 아이디일 경우 key-value 쌍을 추가하고, 등록된 아이디일 경우 value(닉네임)을 수정하게 된다.
채팅방 기록을 리턴할 때 배열의 요소를 loop돌리면서 배열의 아이디와 일치하는 닉네임으로 바꿔준다.
function solution(record) {
var answer = []; // 채팅방 기록을 담는 배열
const user = {}; // 아이디와 닉네임을 저장하는 해시
const splitRecode = record.map(el => el.split(" "));
// recode loop돌리기
// ex. ["Enter", "uid1234", "Muzi"]
for (let el of splitRecode) {
// Enter
if (el[0] === 'Enter') {
// [유저 아이디, "님이 들어왔습니다."]
answer.push([el[1], "님이 들어왔습니다."]);
}
// Leave
else if (el[0] === 'Leave') {
// [유저 아이디, "님이 나갔습니다."]
answer.push([el[1], "님이 나갔습니다."]);
continue;
}
// Enter, Change 시
// 유저 아이디 key - 유저 닉네임 value 쌍
user[el[1]] = el[2];
}
// 채팅방 기록 return
// user에 기록된 닉네임 + "들어왔습니다"/"나갔습니다"
return answer.map(el => user[el[0]] + el[1]);
}