Algorithm/JavaScript

[프로그래머스] 오픈채팅방

🥭맹2 2021. 5. 8. 00:49

1. 문제

programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

2. 접근 방법

Object써서 key에 uid를 담고 value에 nickname을 담아서 nickname을 모두 갱신 한 다음,

각 명령에 맞는 메시지를 출력해줬다.

3. 코드

Javascript

function solution(records) {
    var answer = [];
    let name = new Object()
    let temp = [];
    for (let i=0; i<records.length; i++) {
        let record = records[i].split(' ')
        let command = record[0]
        let uid = record[1]
        if (command === 'Enter') {
            name[uid] = record[2]
            temp.push(uid, 'enter')
        } else {
            if (command === 'Leave') {
                temp.push(uid, 'exit')
            } else {
                name[uid] = record[2]
            }
        }
    }
    for (let i=0; i<temp.length; i+=2) {
        let uid = temp[i]
        let command = temp[i+1]
        if (command === 'enter') {
            answer.push([name[uid], '님이 들어왔습니다.'].join(''))
        } else {
            answer.push([name[uid], '님이 나갔습니다.'].join(''))
        }
    }
    return answer;
}

4. 마치며

풀고 나서 이 코드보고 감동해버렸다.

 

분명 나랑 같은 로직인데 자바스크립트 메서드들을 너무 잘쓴거 아니냐구욧 !

function solution(record) {
    const userInfo = {};
    const action = [];
    const stateMapping = {
        'Enter': '님이 들어왔습니다.',
        'Leave': '님이 나갔습니다.'
    }

    record.forEach((v) => {
        const [state, id, nick] = v.split(' ');

        if(state !== "Change") {
            action.push([state, id]);
        }

        if(nick) {
            userInfo[id] = nick;
        }
    })

    return action.map(([state, uid]) => {
        return `${userInfo[uid]}${stateMapping[state]}`;    
    })
}

[감동 포인트]

1. 일단 split을 저렇게 한 번에 변수에다가 담을 수 있는지 몰랐고, const를 써도 되겠다. (forEach v마다 const가 갱신되므로)

2. state로 안나누고 nick의 존재 유무에 따라 userInfo를 갱신해주는 것

3. 마지막까지 map을 이용해서 기막히게 출력한 것