[프로그래머스][JS]오픈채팅방

Kyle·2020년 12월 24일
0

problem solving

목록 보기
18/36

문제

문제: https://programmers.co.kr/learn/courses/30/lessons/42888#

실제 카카오톡 오픈채팅방의 로직과 매우 비슷한 문제이다.

해결방법

  • user 변수에 ID와 닉네임을 연결 해주는 객체를 만들어서 이용한다. (맨 마지막에 변경된 값을 이용해야 되기 때문)
  • stateArr변수에 Enter,Leave할 때만 정답에 출력하기 때문에 2가지의 상태와 ID를 저장해 준다. (나는 배열로 저장해 줬지만 객체로 저장해 주면 가독성이 조금 더 좋은 코드가 될 수도 있을 것 같다.)
  1. record를 순회하며 데이터 수집
    1-1. Leave가 아닐 경우에는 닉네임이 바뀔 수 있으니까 user에 업데이트해준다.
    1-2. change가 아닌경우에는 stateArr에 Enter,Leave같은 [state,id]를 넣어준다.
  2. 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의 디스트럭처링으로 코드를 보다 이해하기 쉽게 작성해봤다. 배열의 인덱스로 접근하기보다는 디스트럭처링으로 바로 변수를 할당할 수 있는 상황에서는 훨씬 이해하기 쉽게 느껴진다.

profile
Kyle 발전기

0개의 댓글