티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🤔 해결방법
1. 아이디별 가장 마지막 Enter 또는 Change를 찾고 해당 닉네임을 매핑시켜 map에 저장한다.
2. records의 닉네임들을 마지막 닉네임으로 모두 변경한다.
3. action이 Enter와 Change일 때 각 메세지를 answer에 push하고 answer를 출력한다.
🔑 풀이
function solution(record) {
let answer = [];
let records = record.map(e => e.split(' ')); // records = [["Enter","uid1234","Muzi"],...]
const map = new Map(); //키 : 아이디, 값 : 해당 아이디의 가장 마지막 닉네임
//아이디별로 가장 마지막 Enter 또는 Change를 찾아서 아이디와 닉네임을 map에 저장
for (let i = records.length - 1; i >= 0; i--) {
const [action, uid, nickname] = records[i];
if (!map.has(uid) && (action === "Enter" || action === "Change")) {
map.set(uid, nickname); // uid1234 : "Prodo", uid4567 : "Ryan"
}
}
//records의 닉네임들을 가장 마지막 닉네임으로 변경
records = records.map(([action, uid, nickname]) => {
return [action, uid, map.get(uid)]; // records = [["Enter","uid1234","Prodo"],...]
});
//출력
let message = '';
for (let i = 0; i < records.length; i++){
if (records[i][0] === "Enter") {
message = `${records[i][2]}님이 들어왔습니다.`
answer.push(message);
} else if (records[i][0] === "Leave") {
message = `${records[i][2]}님이 나갔습니다.`
answer.push(message);
}
}
return answer;
}
😭 삽질
처음에 문제를 제대로 읽지 않고 무작정 Change가 들어온 경우 닉네임을 바꿔주는 코드를 짰다.
//change가 있으면 아이디가 똑같은 배열을 찾아서 닉네임 변경
const records = record.map(e => e.split(' ')); //[["Enter","uid1234","Muzi"],...]
for (let i = 0; i < records.length; i++){
if (records[i][0] === 'Change'){
for (let j = 0; j < records.length; j++){
if (records[i][1] === records[j][1]) records[j][2] = records[i][2];
}
}
}
그런데 예시를 보니 Leave에는 닉네임이 포함되어 있지 않아 닉네임을 찾아서 출력하는 부분이 필요했다.
그렇다면 Map을 사용해 아이디와 닉네임을 매칭시켜는 방법이 효율적이라는 생각이 들었다.
그런데 이 문제의 포인트는 action이 Change가 들어올 때, 그리고 Enter가 다시 들어오는 즉, 재입장을 할 때마다 닉네임이 바뀐다는 것이다.
그렇다면 아이디별로 가장 마지막 Change 또는 Enter를 찾아서 해당 닉네임으로 변경해주기만 하면 된다.
아이디별 가장 마지막 Change 또는 Enter를 어떻게 찾아 map에 저장할까 생각하다 records를 처음부터 순회하지 말고 뒤에서부터 시작하여 action이 Enter 또는 Change이면서 아이디가 map에 들어있지 않은 것만 map에 넣어줬다.
뒤에서부터 아이디가 map에 들어있지 않은 것만 넣어줘야 앞에 나온 것들은 map에 들어가지 않기 때문에 자동으로 가장 뒤에 있던 즉, 가장 마지막 닉네임이 들어가게 된다.
//키 : 아이디, 값 : 해당 아이디의 가장 마지막 닉네임
const map = new Map();
//아이디별로 가장 마지막 Enter 또는 Change를 찾아서 아이디와 닉네임을 idMap에 저장
for (let i = records.length - 1; i >= 0; i--) {
const [action, uid, nickname] = records[i];
if (!map.has(uid) && (action === "Enter" || action === "Change")) {
map.set(uid, nickname);
}
}
그리고 map에 들어있는 가장 마지막 닉네임으로 records의 닉네임들을 바꿔주는데 이 때 action이 Leave일 때는 닉네임이 추가되어 들어간다.
이후 action에 맞게 메세지를 출력해주면 된다.
//records의 닉네임들을 가장 마지막 닉네임으로 변경
records = records.map(([action, uid, nickname]) => {
return [action, uid, map.get(uid)];
});
//출력
let message = '';
for (let i = 0; i < records.length; i++){
if (records[i][0] === "Enter") {
message = `${records[i][2]}님이 들어왔습니다.`
answer.push(message);
} else if (records[i][0] === "Leave") {
message = `${records[i][2]}님이 나갔습니다.`
answer.push(message);
}
}
'JS-algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 요격 시스템 (javascript) (0) | 2023.07.17 |
---|---|
[프로그래머스] 기능 개발 (javascript) (0) | 2023.07.08 |
[프로그래머스] N진수 게임 (javascript) (0) | 2023.07.08 |