function solution(record) { // "명령어 아이디 이름"
let answer = [];
if(record.length > 100000){
return;
}
//명령어 : Enter, Leave, Change
let logs = [...record];
let Entered = [];
while(logs.length !== 0){
let user = logs.shift().split(' ');
if(user[1].length > 10 || (user[2] && user[2].length > 10 ) ){
return
}
switch(user[0]){
case "Enter":
Entered.push([user[1],user[2],"님이 들어왔습니다."])
break;
case "Leave":
let idx = findoneId(Entered,user[1]);
Entered.push([user[1],Entered[idx][1],"님이 나갔습니다."])
break;
case "Change":
break;
}
}
//console.log(Entered)
Entered = ChangeId(Entered)
Entered.forEach(el =>{
el.shift();
answer.push(el.join(''))
})
return answer;
}
function ChangeId(arr){
let result = {};
let answer = [...arr]
for(let i = 0; i < answer.length ;i++){
result[answer[i][0]] = answer[i][1]
}
let resultKey = Object.keys(result);
for(let i = 0; i <answer.length ;i ++){
answer[i][1] = result[answer[i][0]]
}
for(let i = 0; i <answer.length; i++){
if(answer[i][2] ==="changed"){
answer.splice(i,1);
}
}
return answer;
}
function findoneId(arr, id){
let idx = 0;
for(let i = 0; i< arr.length; i++){
if(arr[i][0]=== id){
idx = i;
return idx;
}
}
return -1;
}
각각의 명령어에 맞는 함수를 줘야겠다는 생각으로 풀었었다.
이 코드 이전은 잘통과되었는데 대신 시간통과가 안되어서 ChangeId
로 따로 빼서 Change
명령이 있던 곳에서 반복문을 안 돌도록 만들었다. 하지만, 결국 테스트는 실패.
그래서 좀더 간단하게 풀어보기로 했다. 처음부터 key - value로 접근해서 유저의 이름을 정리하고
recode의 내용을 마지막에 모두 바꾼다는 아이디어는 그대로 차용하는것으로 했다.
function solution(record) {
let answer = [];
let users = {}
let logs = record.map(el => {
let newEl = el.split(' ');
if(newEl.length ===3){
users[newEl[1]] = newEl[2];
}
return newEl
})
for(let i = 0;i< logs.length; i++){
if(logs[i][0] === "Enter"){
answer.push(users[logs[i][1]]+"님이 들어왔습니다.")
} else if(logs[i][0]==="Leave"){
answer.push(users[logs[i][1]]+"님이 나갔습니다.")
}
}
return answer;
}
반성할 점:
1. 애초에 슈도코드를 먼저 작성했다면, 길게 돌아가는 오류는 범하지 않지 않았을까?
2. 가능하면 반복문을 최소화하자!