https://programmers.co.kr/learn/courses/30/lessons/42888
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 채팅방을 들어오거나 나가거나 닉네임을 변경하는 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return - 주어진 자료는 무엇인가?
- 채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어진다. - 조건은 무엇인가?
- 중복 닉네임 허용
- record는 다음과 같은 문자열이 담긴 배열이며, 길이는 1 이상 100,000 이하이다.
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는 1 이상 10 이하이다.
- 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
2. 계획
- 주어진 배열을 쪼개서 2차원 배열로 만든다.
- 비어있는 맵 객체를 만든다.
- 1번 배열을 순회하면서 현재 요소의 0번째 인덱스가 Enter 혹은 Change 인 경우 위 맵 객체에 아이디랑 이름을 넣는다.
- 1번 배열을 순회하면서 현재 요소의 0번째 인덱스가
4-1 Enter인 경우 2번 맵에서 이름을 가져온다.
4-2 Leave인 경우 2번 맵에서 이름을 가져온다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (record) => {
const recordArr = record.map((it) => it.split(' '));
let userIds = new Map();
let result = [];
recordArr.map(it => {
if (it[0] === "Enter" || it[0] === "Change") {
userIds.set(it[1], it[2]);
}
})
recordArr.map(it => {
if (it[0] === 'Enter') {
result.push(`${userIds.get(it[1])}님이 들어왔습니다.`);
} else if (it[0] === 'Leave') {
result.push(`${userIds.get(it[1])}님이 나갔습니다.`);
}
})
return result;
};
test('chat', () => {
expect(solution(["Enter uid1234 Muzi", "Enter uid4567 Prodo", "Leave uid1234", "Enter uid1234 Prodo", "Change uid4567 Ryan"])).toEqual(["Prodo님이 들어왔습니다.", "Ryan님이 들어왔습니다.", "Prodo님이 나갔습니다.", "Prodo님이 들어왔습니다."]);
});
'코테연습' 카테고리의 다른 글
73. 프린터 Javascript (0) | 2022.07.01 |
---|---|
72. 가운데 글자 가져오기 Javascript (0) | 2022.06.30 |
70. 카펫 Javascript (0) | 2022.06.27 |
69. 가장 큰 수 Javascript (0) | 2022.06.24 |
68. 같은 숫자는 싫어 Javascript (0) | 2022.06.23 |
댓글