프로그래머스
handleEvent에서 uid에 대한 최종적인 닉네임을 obj에 저장한다. arr의 요소를 반복문으로 방문하여, 'Enter', 'Leave'인 것들을 찾아 결과를 배열 res에 푸시한다. 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, 구조분해할당을 해주어 가독성 있고, 이해하기 쉽다.
그리고, 각 변수에 값을 적절히 저장해서 사용했는데, action은 userInfo와 stateMapping에서 필요한 내용을 찾기 위한 키가 저장되어있다.
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]}`;
});
}