📄 문제
- 간단 설명
- 채팅방에 들어오고 나가거나,
- 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때,
- 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를
- 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.
- 형식
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장 - "Enter [유저 아이디] [닉네임]" (ex. "Enter uid1234 Muzi")
- [유저 아이디] 사용자가 채팅방에서 퇴장 - "Leave [유저 아이디]" (ex. "Leave uid1234")
- [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경 - "Change [유저 아이디] [닉네임]" (ex. "Change uid1234 Muzi")
- 주의점
- 닉네임 변경이 있어서 조금 복잡한 것 같다. 최종 변경 사항으로 모두 적용해서 출력해야 한다!
- 닉네임 변경 방법 두가지
- 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
- 채팅방에서 닉네임을 변경한다.
📝 나의 통과 풀이
function solution(record) {
let answer = [];
let state = new Map();
record.forEach((user) => {
let [type, userId, name] = user.split(" ");
if (type == "Enter" || type == "Change") {
state.set(userId, name);
}
});
record.forEach((user) => {
let [type, userId, name] = user.split(" ");
if (type == "Enter") {
let userIn = state.get(userId) + "님이 들어왔습니다.";
answer.push(userIn);
}
if (type == "Leave") {
let userOut = state.get(userId) + "님이 나갔습니다.";
answer.push(userOut);
}
});
return answer;
}
⌨ 접근법
1. new Map을 사용해서 id와 name 저장하기 위해 state 변수 선언
2. 반복문을 돌려서 record 의 각 요소마다 state 만들기
2-1. 공백을 기준으로 ( user.split(" ") ) 각 요소의 type, userId, name 변수로 나눠서 저장
2-2. 만약의 들어오는 type 이 "Enter" 이거나 "Change" 이면 state에 userid : name 으로 저장한다.
2-3. 그러면 userId 에 따라 name을 계속 업데이트 시켜서 최종 변경 이름까지 잘 들어간다!
3. 또 반복문을 돌려서 record의 요소 수 만큼 문자열을 만들어 answer에 넣어주기 (그냥 for 문법을 쓸 걸 그랬다.)
3-1. 2-1 처럼 공백을 기준으로 ( user.split(" ") ) 각 요소의 type, userId, name 변수로 나눠서 저장
3-2. 들어오는 type이 "Enter" 채팅방에 들어온 유저면 state 에서 userId 로 조회해 문자열 붙여서 answer에 push
3-3. 들어오는 type이 "Leave" 채팅방에서 나간 유저면 state 에서 userId 로 조회해 문자열 붙여서 answer에 push
3-4. 반복문이 모두 끝나면 문자열이 다 들어간 answer return
📖 배운 점
1. Map
- Map 사용이 서툴렀는데 이 문제로 계속 수정 반복 하다 보니 제법 익숙해진 것 같다!
2. 구조 분해 할당
- 이 문제는 우리 팀의 레오의 코드를 참조해서 풀었다.
- 레오의 코드( const [type, uid, name] = item.split(' '); ) 를 나도 적용해보니 코드가 너무 깔끔해져서 놀랐다.
- 앞으로도 자주 사용할 것 같다!
📚 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42888
코딩테스트 연습 - 오픈채팅방
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오
programmers.co.kr
'TEAM 알고싶다 > 성공 문제' 카테고리의 다른 글
[LeetCode] 152. Maximum Product Subarray(최대로 생성된 부분 배열?) (0) | 2022.06.14 |
---|---|
[LeetCode] 41. First Missing Positive (처음 누락된 양수?) (0) | 2022.06.13 |
[프로그래머스] JavaScript - 구명보트 (0) | 2022.06.06 |
[LeetCode] 4. Median of Two Sorted Arrays (정렬된 두 배열의 중앙값) (0) | 2022.06.03 |
[LeetCode] 34. Find First and Last Position of Element in Sorted Array (정렬된 배열에서 요소의 첫 번째 및 마지막 위치 찾기) (0) | 2022.06.01 |