문제
코딩테스트 연습 - 오픈채팅방
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오
programmers.co.kr
풀이
먼저 조건을 살펴본다.
채팅방 기록 record배열에는 Enter, Leave, Change 3개의 명령어가 존재한다.
유저는 아이디와 닉네임을 가진다.
아이디는 고유하다. 닉네임은 중복이 가능하며 변경도 가능하다.
모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 출력한다.
이 부분에서 볼 수 있듯이, 모든 기록을 먼저 처리를 하고 마지막에 모든 메시지들을 출력을 해줘야 한다.
기록을 처리하면서 함께 메시지를 출력하면 변경된 닉네임을 적용할 수 없기 때문이다.
풀이 절차는 다음과 같다.
1. record 배열 원소를 차례대로 처리하면서, users 객체에 {id : nickname} 정보로 추가/변경해준다.
출력을 위해 cmds 배열에 Enter, Leave 명령일 때 명령과 id를 추가해준다.
2. cmds 배열 원소를 차례대로 처리하면서, 출력되는 메시지를 모두 배열에 넣고 배열을 리턴한다.
이 생각을 가지고 우선 코드를 작성했다.
코드
function solution(record) {
const users = {};
const orders = [];
for (let rec of record) {
const [cmd, uid, nickname] = rec.split(" ");
if (cmd === "Enter") {
users[uid] = nickname;
orders.push([cmd, uid]);
} else if (cmd === "Leave") {
orders.push([cmd, uid]);
} else if (cmd === "Change") {
users[uid] = nickname;
}
}
const results = [];
for (let order of orders) {
const [cmd, uid] = order;
if (cmd === "Enter") {
results.push(`${users[uid]}님이 들어왔습니다.`);
} else if (cmd === "Leave") {
results.push(`${users[uid]}님이 나갔습니다.`);
}
}
return results;
}
직관적으로 1,2 스텝의 순서를 차례대로 적었다.
코드에 중복이 많아 더 간결하게 바꿨다.
다음과 같다.
function solution(record) {
const users = {};
const cmds = [];
const cmdObj = {
Enter: "님이 들어왔습니다.",
Leave: "님이 나갔습니다.",
};
for (let rec of record) {
const [cmd, uid, nickname] = rec.split(" ");
if (nickname) users[uid] = nickname;
if (cmd !== "Change") cmds.push([cmd, uid]);
}
return cmds.map(([cmd, uid]) => `${users[uid]}${cmdObj[cmd]}`);
}
'DS & Algorithm > programmers' 카테고리의 다른 글
[프로그래머스] 피보나치 수 - 자바스크립트 (0) | 2021.06.19 |
---|---|
[프로그래머스] 튜플 - 자바스크립트 (0) | 2021.06.19 |
[프로그래머스] 소수 찾기 - 자바스크립트 (0) | 2021.06.18 |
[프로그래머스] 괄호 변환 - 자바스크립트 (0) | 2021.06.18 |
[프로그래머스] 게임 맵 최단거리 - 자바스크립트 (0) | 2021.06.18 |