문제 설명 : https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 요약 :
- 유저가 들어올 때, 나갈 때의 로그를 출력해야 한다.
- 중간에 닉네임이 변경되면, 변경된 닉네임이 최종적으로 출력되어야 한다.
- 닉네임은 나가서 변경하고 재입장, Change 커맨드를 통해 변경할 수 있다.
문제 풀이 시간 : 20분
문제 성공 여부 : 성공
접근 방법(성공) :
- 최종적으로 유저의 uuid에 따른 이름만 알면 되기에, Map으로 이름을 최신화한다.
- 입장과 퇴장 로그만 출력하면 되기에, 해당 로그만 따로 관리한다.
위에 글과 같이 이 문제는 맵만 사용할 줄 알면 쉽게 해결할 수 있다.
이 문제에서 가장 까다로운 부분은 변경된 닉네임을 어떻게 저장할 것이냐 이다.
첫 번째 경우는 유저가 나가고, 다시 입장할 때 닉네임이 변경된 닉네임으로 들어오는 경우이다.
이 경우, 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의 구조분해 할당이 되게 마음에 든다
'코테 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 자물쇠와 열쇠 - Javascrip (0) | 2025.09.27 |
|---|---|
| [프로그래머스] 이중우선순위큐 - Javascript (5) | 2025.08.18 |
| [프로그래머스] 디펜스 게임 - Javascript (4) | 2025.08.15 |
| [프로그래머스] 방금그곡 - Javascript (8) | 2025.08.07 |
| [프로그래머스] N-Queen - Javascript (3) | 2025.08.05 |