프로그래머스
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]}`;
});
}