Algorithm

[CodeKata] 프로그래머스: 3.27(토), 오픈채팅방

ttaeng_99 2021. 3. 28. 21:16
반응형

🥋 Ooooth!! (Level 2)

 

 🧮 풀이

function solution(record) {  
  record = record.map(ele => {
    ele = ele.split(" ")
    return {
      type: ele[0],
      id: ele[1],
      name: ele[2],
    }
  })

  let idCheck = {};
  for (let i=0 ; i < record.length ; i++) {
    const { type, id, name } = record[i];
    if (!idCheck[id]) {
      idCheck[id] = name;
    }
    else {
      if (type !== "Leave") {
        idCheck[id] = record[i].name;
      }
    }
  }

  return record.filter(ele => ele.type !== 'Change').map(ele => ele.type === "Enter" ? `${idCheck[ele.id]}님이 들어왔습니다.` : `${idCheck[ele.id]}님이 나갔습니다.`)
}
  1. record 각 요소가 문자열이기 때문에, split(" ") 한 다음 { type, id, name } 세 프로퍼티로 분류해준다.
  2. idCheck는 id에 대한 name 정보를 key-value 형태로 저장하는 객체이다.
  3. record 배열을 순회한다. idCheck에 id-name 정보가 없다면 추가, 있다면 type이 "Enter" 혹은 "Change"인 경우 키값을 갱신한다.
  4. 다시, record 배열을 메세지가 출력될 "Enter", "Leave"로만 filter() 한다.
  5. 그리고, 각 type에 대한 메세지를 삼항연산자로 반환한다. 이 때, 이름은 각 id값으로 idCheck의 최신화된 값을 입력한다.

 

🖇 리뷰

모범답안도 로직은 나와 유사했으나, JS문법을 더 현명하게 활용해서 코드가 매우 간결하기에 소개해보았다.

function solution(record) {
    const userInfo = {};
    const action = [];
    const stateMapping = {
        'Enter': '님이 들어왔습니다.',
        'Leave': '님이 나갔습니다.'
    }

    record.forEach((v) => {
        const [state, id, nick] = v.split(' ');

        if(state !== "Change") {
            action.push([state, id]);
        }

        if(nick) {
            userInfo[id] = nick;
        }
    })

    return action.map(([state, uid]) => {
        return `${userInfo[uid]}${stateMapping[state]}`;    
    })
}

userInfo가 idCheck 객체 역할을 한다. action은 반환할 answer 배열로 여기에 메세지 정보를 누적한 뒤 다시 메세지로 맵핑해서 반환했다.

 

stateMapping 객체는, "Enter", "Leave" 두 케이스에 대한 메세지값을 가진 객체다. 나는 메세지가 2가지라 적용하지 않았지만, 케이스가 많아질 경우 위 방법을 활용하는 것이 유리하다.

 

record를 순회하는데, 위처럼 [state, id, nick] = v.split(" ") 문법을 통해 split된 각 요소값에 변수명을 할당한 모습이다.

state가 "Change" 가 아니라면 action 메세지를 반환하므로 action에 push, nick이 존재한다면 닉네임이 바뀐 것으로 userInfo를 갱신한다.

 

마지막으로, action의 메세지 정보들을 메세지로 맵핑한다. userInfo에서 id 값으로, stateMapping에서 state 값으로 각 메세지를 가져온다. 정말 현명한 객체 지향 프로그래밍의 풀이를 보여준 것 같다!! 🤩🤩🤩

반응형