-
[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]}님이 나갔습니다.`) }
- record 각 요소가 문자열이기 때문에, split(" ") 한 다음 { type, id, name } 세 프로퍼티로 분류해준다.
- idCheck는 id에 대한 name 정보를 key-value 형태로 저장하는 객체이다.
- record 배열을 순회한다. idCheck에 id-name 정보가 없다면 추가, 있다면 type이 "Enter" 혹은 "Change"인 경우 키값을 갱신한다.
- 다시, record 배열을 메세지가 출력될 "Enter", "Leave"로만 filter() 한다.
- 그리고, 각 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 값으로 각 메세지를 가져온다. 정말 현명한 객체 지향 프로그래밍의 풀이를 보여준 것 같다!! 🤩🤩🤩
반응형'Algorithm' 카테고리의 다른 글
[CodeKata] 프로그래머스: 4.1(목), 방금그곡 (0) 2021.04.03 [CodeKata] 프로그래머스: 3.29(월), 후보키 / [이론] 비트 연산자 (0) 2021.03.29 [CodeKata] 프로그래머스 : 3.26(금), 캐시 / [이론] 캐시 교체 알고리즘 (0) 2021.03.26 [CodeKata] 프로그래머스 : 3.25(목), 프렌즈4블록 (0) 2021.03.25 [CodeKata] 프로그래머스 : 3.24(수), 뉴스 클러스터링 (0) 2021.03.25