[Lv2] 오픈채팅방

Creating the dots·2022년 2월 8일
0

Algorithm

목록 보기
62/65

프로그래머스

나의 풀이

  • 함수 handleEvent에서 uid에 대한 최종적인 닉네임을 obj에 저장한다.
    • 닉네임 변경 후에는 모든 기록에서도 닉네임이 변경되어한다. 매번 닉네임이 바뀔때마다 기록을 바꾸지 않고, uid에 대한 최종적인 닉네임을 저장해서 한번에 바꾸도록 한다.
    • uid 고유한 값이므로 동일한 닉네임을 가졌더라도 다른 uid를 갖는다.
  • 배열 arr의 요소를 반복문으로 방문하여, 'Enter', 'Leave'인 것들을 찾아 결과를 배열 res에 푸시한다.
    • 배열 arr에는 record의 요소들이 배열의 형태로 저장되어있다.
      const arr = [['Enter', 'uid1234', 'Muzi],['Enter', 'uid4567', 'Prodo'], ...]
function solution(record) {
  const obj = {};
  const arr = [];
  const res = [];
  const handleEvent = (str) => {
    const words = str.split(" ");
    if(words[0] === 'Enter' || words[0] === 'Change') {
      obj[words[1]] = words[2];
    }
    arr.push(words);
  }
  for(let i=0; i<record.length; i++) {
    handleEvent(record[i]);
  }
  for(let i=0; i<arr.length; i++) {
    const name = obj[arr[i][1]];
    if(arr[i][0] === 'Enter') {
      res.push(`${name}님이 들어왔습니다.`);
    }
    else if(arr[i][0] === 'Leave') {
      res.push(`${name}님이 나갔습니다.`);
    }
  }
  return res;
}

다른분의 풀이

나는 반복문과 함수를 분리해서 작성했는데, 이 풀이에서는 forEach 반복문안에서 split, 구조분해할당을 해주어 가독성 있고, 이해하기 쉽다.
그리고, 각 변수에 값을 적절히 저장해서 사용했는데, actionuserInfostateMapping에서 필요한 내용을 찾기 위한 키가 저장되어있다.

  • userInfo에 uid에 대한 닉네임을 저장한다.
  • action에 Enter와 Leave에 대한 이벤트와 대상을 저장한다.
  • stateMapping에는 Enter와 Leave에 대해 각각 작성할 문구를 저장한다.
function solution(record) {
  const userInfo = {};
  const action = [];
  const stateMapping = {
    'Enter' : '님이 들어왔습니다.',
    'Leave' : '님이 나갔습니다.'
  }
  record.forEach( v => {
    const [state, id, nick] = v.split(" ");
    if(state !== "Change") { //state가 Enter, Leave인 경우 
      action.push([state, id])
    }
    if(nick) { //state가 Enter, Change인 경우
      userInfo[id] = nick;
    }
  });
  return action.map(([state, uid]) => {
    return `${userInfo[uid]}${stateMapping[state]}`;
  });
}
profile
어제보다 나은 오늘을 만드는 중

0개의 댓글