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]}님이 나갔습니다.`)
}
- 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 값으로 각 메세지를 가져온다. 정말 현명한 객체 지향 프로그래밍의 풀이를 보여준 것 같다!! 🤩🤩🤩
반응형