ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeKata] 프로그래머스: 3.27(토), 오픈채팅방
    Algorithm 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 값으로 각 메세지를 가져온다. 정말 현명한 객체 지향 프로그래밍의 풀이를 보여준 것 같다!! 🤩🤩🤩

    반응형
Designed by Tistory.