[프로그래머스][JS]오픈채팅방
문제
문제: https://programmers.co.kr/learn/courses/30/lessons/42888#
실제 카카오톡 오픈채팅방의 로직과 매우 비슷한 문제이다.
해결방법
user
변수에 ID와 닉네임을 연결 해주는 객체를 만들어서 이용한다. (맨 마지막에 변경된 값을 이용해야 되기 때문)stateArr
변수에 Enter,Leave할 때만 정답에 출력하기 때문에 2가지의 상태와 ID를 저장해 준다. (나는 배열로 저장해 줬지만 객체로 저장해 주면 가독성이 조금 더 좋은 코드가 될 수도 있을 것 같다.)
- record를 순회하며 데이터 수집
1-1. Leave가 아닐 경우에는 닉네임이 바뀔 수 있으니까user
에 업데이트해준다.
1-2. change가 아닌경우에는stateArr
에 Enter,Leave같은 [state,id]를 넣어준다. stateArr
를 순회하며 state에 따라 answer에 넣어준다.
code
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의 디스트럭처링으로 코드를 보다 이해하기 쉽게 작성해봤다. 배열의 인덱스로 접근하기보다는 디스트럭처링으로 바로 변수를 할당할 수 있는 상황에서는 훨씬 이해하기 쉽게 느껴진다.
Author And Source
이 문제에 관하여([프로그래머스][JS]오픈채팅방), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@proshy/프로그래머스JS오픈채팅방저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)