코테/프로그래머스

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

tony1724 2025. 8. 17. 15:54

문제 설명 : https://school.programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 요약 :

  1. 유저가 들어올 때, 나갈 때의 로그를 출력해야 한다.
  2. 중간에 닉네임이 변경되면, 변경된 닉네임이 최종적으로 출력되어야 한다.
  3. 닉네임은 나가서 변경하고 재입장, Change 커맨드를 통해 변경할 수 있다.

 

문제 풀이 시간 : 20분

문제 성공 여부 : 성공

 

 

접근 방법(성공) :

  1. 최종적으로 유저의 uuid에 따른 이름만 알면 되기에, Map으로 이름을 최신화한다.
  2. 입장과 퇴장 로그만 출력하면 되기에, 해당 로그만 따로 관리한다.

위에 글과 같이 이 문제는 맵만 사용할 줄 알면 쉽게 해결할 수 있다.

 

이 문제에서 가장 까다로운 부분은 변경된 닉네임을 어떻게 저장할 것이냐 이다.

 

첫 번째 경우는 유저가 나가고, 다시 입장할 때 닉네임이 변경된 닉네임으로 들어오는 경우이다.

이 경우, map에 uuid가 저장되어 있기 때문에 계속해서 변경된 닉네임으로 최신화해주면 된다.

 

두 번째 경우는 유저가 채팅방에 있을 때, Change 커맨드를 통해 변경하는 경우이다.

이경우도, 마찬가지로 map에 닉네임을 최신화해주면 된다.

 

이 과정을 반복하며 Enter uuid와 Leave uuid만 따로 log에 저장하고, 

최종적으로 uuid에 따른 닉네임을 로그 양식(x님이 들어오셨습니다)에 맞게 로그를 만들면 된다.

 

전체 코드(성공) :

function solution(record) {
    const logs = [];
    const user = new Map(); // (uuid, name) 으로 구성된 맵
    
    for(const rec of record){
        const [cmd, uuid, name] = rec.split(' '); // 커맨드, uuid, 이름으로 분리한다.
        
        if(cmd !== "Change"){ // 입장과 퇴장만 로그에 저장한다.
            logs.push([cmd,uuid]);
        }
        
        if(name){ // 이름이 있다면(Enter, Change) 닉네임 최신화를 해준다.
            user.set(uuid, name);
        }
    }
    
    
    const ans = [];
    for(const log of logs){
        const [cmd, uuid] = log;
        const name = user.get(uuid); // 최종적으로 변경된 유저의 이름을 가져온다.
        
        if(cmd === "Enter"){ // 로그에 맞게 올바른 로그를 재생성한다.
            ans.push(`${name}님이 들어왔습니다.`);
        }
        else {
            ans.push(`${name}님이 나갔습니다.`)
        }
    }
    
    return ans;
}

 

개인적으로 js의 구조분해 할당이 되게 마음에 든다