[PS] 프로그래머스(Level2) - 오픈채팅방(KAKAO 2019) - JavaScript

23554 단어 JavaScriptpsJavaScript

2021.4.29

문제

프로그래머스(Level2) - 오픈채팅방(KAKAO 2019)
문제 링크

코드 및 감상

처음 코드

function solution(record) {
    let answer = [];
    
    let user_infos = {};
    
    record.forEach((e)=>{
        if(e.substr(0, 5) === "Enter") {
            let idx1, idx2;
            for(let i = 0; i < e.length; i++) {
                if(e[i] === ' ') {
                    idx1 = i + 1;
                    break;
                }
            }
            
            for (let i = idx1; i < e.length; i++) {
                if(e[i] === ' ') {
                    idx2 = i - 1;
                    break;
                }
            }
            
            let id = e.substr(idx1, idx2 - idx1 + 1);
            let nickname = e.substr(idx2 + 2);
            user_infos[id] = nickname;
            answer.push(`E ${id}`);
            
        } 
        else if(e.substr(0, 5) === "Leave") {
            let idx;
            for(let i = 0; i < e.length; i++) {
                if(e[i] === ' ') {
                    idx = i + 1;
                    break;
                }
            }
            
            const id = e.substr(idx);
            answer.push(`L ${id}`);
        }
            
        else { // change
            let idx1, idx2;
            
            for(let i = 0; i < e.length; i++) {
                if(e[i] === ' ') {
                    idx1 = i + 1;
                    break;
                }
            }
            
            for (let i = idx1; i < e.length; i++) {
                if(e[i] === ' ') {
                    idx2 = i - 1;
                    break;
                }
            }
            
            let id = e.substr(idx1, idx2 - idx1 + 1);
            let nickname = e.substr(idx2 + 2);
            
            user_infos[id] = nickname;
        }
    });
    
    answer = answer.map((e) => {
        const id = e.substr(2);
        if(e[0] === 'E') {
            return `${user_infos[id]}님이 들어왔습니다.`;
        } 
        else {
            return `${user_infos[id]}님이 나갔습니다.`;
        }
    });
    return answer;
}

console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));

str.substr(), arr.forEach(), arr.map()

  • 풀이는 바로 떠올랐지만, js에 익숙치않아 문자열에서 id와 nickname을 어떻게 파싱할지가 생각이 안났다.

  • 그래서 그냥 원시적으로 for문을 돌며 두 space 위치를 찾는 방식으로 했다..

  • 풀고나서 다른 사람의 js풀이를 찾아보니 str.split() 을 썼어야 했다.!!

  • 입력 배열의 최대크기가 10만이었는데,

  • 시간초과가 안나는걸 보고, js object에서 key찾을 때 드는 time complexity을 찾아보니 O(1)이었다.! (내부에서 hash table을 이용. 설명 링크)

  • 그리고 순간 str.substr()에서 인자를 하나만 넣었을 때 length라고 착각했다. (이것때문에 시간 좀 날림..)

    • string.prototype.substr(pos[, len]) 이다.

개선된 코드

function solution(record) {
    const answer = [];
    const tmp = [];
    const id_to_nick = {};
    
    record.forEach((e)=>{
        const [behavior, id, nickname] = e.split(' ');

        if(behavior !== "Change") {
            tmp.push([behavior, id]);
        } 
        if(nickname) {
            id_to_nick[id] = nickname;
        }
    });

    tmp.forEach((e) => {
        const [behavior, id] = e;
        if(behavior === "Enter")
            answer.push(`${id_to_nick[id]}님이 들어왔습니다.`);
        else
            answer.push(`${id_to_nick[id]}님이 나갔습니다.`);
    });
    
    return answer;
}

console.log(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]));
  • str.split() 이용
  • destructuring (구조분해할당) 이용

좋은 웹페이지 즐겨찾기