2019 KAKAO BLIND RECRUITMENT 문제이며 레벨2로 구분되어있다.
문제가 길지만 대부분 예시이고, 요약하자면 record를 해석하여 채팅방 출입 메세지를 출력하는 문제이다.
결국 가장 간단하게 생각하면 문제는 채팅방 출입 메세지를 "유저별 최종닉네임 기준"으로 출력하는 것이다.
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 }