문제: https://programmers.co.kr/learn/courses/30/lessons/42888#
실제 카카오톡 오픈채팅방의 로직과 매우 비슷한 문제이다.
user
변수에 ID와 닉네임을 연결 해주는 객체를 만들어서 이용한다. (맨 마지막에 변경된 값을 이용해야 되기 때문)stateArr
변수에 Enter,Leave할 때만 정답에 출력하기 때문에 2가지의 상태와 ID를 저장해 준다. (나는 배열로 저장해 줬지만 객체로 저장해 주면 가독성이 조금 더 좋은 코드가 될 수도 있을 것 같다.)user
에 업데이트해준다.stateArr
에 Enter,Leave같은 [state,id]를 넣어준다.stateArr
를 순회하며 state에 따라 answer에 넣어준다.function solution(record) {
const answer = [];
const user = {};
const stateArr = [];
record.forEach((data) => {
const [state, id, nickName] = data.split(' ');
//새로들어오거나 or Change할 때 닉네임 변경
if (state !== 'Leave') user[id] = nickName;
//Enter or Leave 때만 출력해주니 stateArr에 넣어준다.
if (state !== 'Change') {
stateArr.push([state, id]);
}
});
stateArr.forEach((data) => {
const [state, id] = data;
if (state === 'Enter') {
answer.push(`${user[id]}님이 들어왔습니다.`);
} else {
answer.push(`${user[id]}님이 나갔습니다.`);
}
});
return answer;
}
위에 push
를 해주기 보다 map
을 이용해 바로 배열로 만들어주어도 간단하다.
answer = stateArr.map((data) => {
const [state, id] = data;
if (state === 'Enter') return `${user[id]}님이 들어왔습니다.`;
else return `${user[id]}님이 나갔습니다.`;
});
return answer
user라는 객체를 이용해서 닉네임을 계속 업데이트해주는 것이 이 문제의 point가 아닐까 생각해 본다.
JS의 디스트럭처링으로 코드를 보다 이해하기 쉽게 작성해봤다. 배열의 인덱스로 접근하기보다는 디스트럭처링으로 바로 변수를 할당할 수 있는 상황에서는 훨씬 이해하기 쉽게 느껴진다.