프로그래머스_JS - 오픈채팅방

nd098pkc·2022년 6월 10일
0

코딩테스트 준비

목록 보기
5/15

2019 KAKAO BLIND RECRUITMENT 문제이며 레벨2로 구분되어있다.

문제

문제가 길지만 대부분 예시이고, 요약하자면 record를 해석하여 채팅방 출입 메세지를 출력하는 문제이다.

풀이과정

<입력>

  1. 채팅방 출입, 닉네임변경 내역이 기록된 "record"(Array)

<핵심아이디어>

결국 가장 간단하게 생각하면 문제는 채팅방 출입 메세지를 "유저별 최종닉네임 기준"으로 출력하는 것이다.
record가 시간순서라는 것을 생각하면 유저별로 처음 입장할때 닉네임을 기록하고 그 후에 동일한 id에서 다른 닉네임이 나타나면 덮어쓰는 과정을 반복하면 최후에는 유저별 최종 닉네임만 남게된다.

<닉네임 기록 및 갱신하기>

    let users = new Map();                      //유저별 닉네임 정보 기록할 HashMap 생성
    let records = record.map(a=>a.split(' '))   //record 정보가 String으로 붙어있어서 분리해준다. 
                                                  그러면 0번인덱스는 어떤 action인지, 1번인덱스는 id, 2번인덱스는 닉네임 정보가 담긴다
 for(const info of records){                    //기록의 각 데이터를 순회하면서
     if(info[0]!='Leave'){                      //Leave가 아니고 Enter나 Change라면
         users.set(info[1],info[2])             //해당 id에 닉네임을 기록한다
     }                                          //원래 값이 있었다면 자동으로 그 기록을 지우고 새 닉네임을 덮어쓰게된다.
 }

<기록된 닉네임으로 출입기록 출력>

그 뒤엔 단순하게 Change를 제외하고 출입기록에 따라 최종 닉네임을 기준으로 메세지를 정답배열에 넣어주면된다.

    let answer=[];                   //정답배열
    for(const info of records){               
        if(info[0]=='Enter'){        //Enter인 경우에는 해당 id의 최종 닉네임을 꺼내 "최종닉네임"님이 들어왔습니다 를 정답배열에 넣어준다.
            answer.push(`${users.get(info[1])}님이 들어왔습니다.`)
        }
        else if(info[0]=='Leave'){   //Leave인 경우에는 해당 id의 최종 닉네임을 꺼내 "최종닉네임"님이 나갔습니다 를 정답배열에 넣어준다.
            answer.push(`${users.get(info[1])}님이 나갔습니다.`)
        }
    }
    return answer

결과는? 출입기록을 출력할 때의 닉네임 기준이 채팅방 나갈때를 기준으로 한다던가 다양했으면 조금 더 어려웠을것 같은데 무조건 최종 닉네임 기준으로만 생각하면 되어서 레벨2치고 쉬운 문제였다고 생각한다.
그런데 다른분들 풀이를 보던중 나는 처음보는걸 발견하게됐는데

let str='abc'
let [new]=str

이런 코드가 있을 때 new를 출력하면 무엇이 나올까?

내 예상과는 다르게 'a'를 출력하였다.

저런 용도로 활용하기 위해 있는 것인지는 모르겠지만 꽤 흥미로운 결과여서 기록해두고 싶었다.

전체코드

function solution(record) {
    let users = new Map();
    let records = record.map(a=>a.split(' '))
 for(const info of records){
     if(info[0]!='Leave'){
         users.set(info[1],info[2])
     }
 }
    let answer=[];
     for(const info of records){
         if(info[0]=='Enter'){
             answer.push(`${users.get(info[1])}님이 들어왔습니다.`)
         }
         else if(info[0]=='Leave'){
             answer.push(`${users.get(info[1])}님이 나갔습니다.`)
         }
     }
     return answer
 }
profile
늦게배운 코딩이 무섭다

0개의 댓글