TIL 20210707

Jean Deluge·2021년 7월 7일
0

TIL

목록 보기
18/19

프로그래머스 오픈채팅방

내가 처음에 짰던 코드.

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. 가능하면 반복문을 최소화하자!

profile
node.js , rudyonrails개발자

0개의 댓글