Coding test

[프로그래머스] 오픈채팅방 (Lv 2) - javascript

Jiwoo 2022. 5. 24. 23:20

문제

카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다.
신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.
 
"[닉네임]님이 들어왔습니다."
 
채팅방에서 누군가 나가면 다음 메시지가 출력된다.
 
"[닉네임]님이 나갔습니다."
 
채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.
 
채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
채팅방에서 닉네임을 변경한다.
닉네임을 변경할 때는 기존에 채팅방에 출력되어 있던 메시지의 닉네임도 전부 변경된다.
 

문제 더보기


 

📌 풀이

1차 풀이

function solution(record) {

    record = record.map(v => v.split(' '));
    let obj = {};

    for(let i = 0; i < record.length; i++) {
        let v = record[i];
        if(v[0] !== 'Leave') obj[v[1]] = v[2];
    }

    let answer = [];

    for(let i = 0; i < record.length; i++) {
        let v = record[i];
        if(v[0] === 'Enter') answer.push(`${obj[v[1]]}님이 들어왔습니다.`)
        else if(v[0] === 'Leave') answer.push(`${obj[v[1]]}님이 나갔습니다.`)
    }

    return answer;
}

 
for문을 두 번 돌려 해결했다.
첫 번째로 EnterChange를 찾아 아이디와 닉네임을 객체에 저장하고
(Leave는 찾을 필요 없음. 찾아서 삭제할 필요도 없다.
만약 찾아서 값을 삭제한다면 두 번째 순회로 문장을 출력할 때 닉네임을 찾을 수 없기 때문)
두 번째로 순회하며 문장을 배열에 저장했다.
 

  • 정확도 테스트 결과

 

2차 풀이

function solution(record) {

    record = record.map(v => v.split(' ')); // 배열로 변환
    let obj = {};

    record.forEach(v => { // 객체에 id : nickname 저장
        if(v[0] !== 'Leave') obj[v[1]] = v[2];
    } )

    let answer = [];

    record.forEach(v => { // 출력 문구 저장
        if(v[0] === 'Enter') answer.push(`${obj[v[1]]}님이 들어왔습니다.`)
        else if(v[0] === 'Leave') answer.push(`${obj[v[1]]}님이 나갔습니다.`)
    })

    return answer;
}

 
for문을 forEach 메서드로 간결하게 수정했다.