반응형
2021_07_11 문제풀이
문제 URL : https://programmers.co.kr/learn/courses/30/lessons/42888?language=javascript
문제
의사 코드
// 방을 개설한 사람이 보게 되는 최종 메시지를 문자열 배열 형태로 return
// 모든 유저의 아이디를 객체의 키로 저장,
// Enter > 무조건 닉네임 포함
// Leave > 아이디 불포함
// Change > 덮어씌울 닉네임 포함
1. record를 forEach로 순회한다
record[i]를 string.split(" ") 로 나눈 값의 1번 인덱스값은 유저 아이디
0번 인덱스가 Leave가 아닌 모든 경우 (Enter or Change)
obj[userId] = 2번 인덱스 값으로 할당(닉네임)
2. record를 forEach로 순회
el을 split(" ")으로 쪼갠다
1번 인덱스 값은 유저 아이디
만약, 0번 인덱스 값이 "Change"가 아니라면
`${obj[userId]}님이 ${1번 인덱스가 Enter면 ? "들어왔습니다." : "나갔습니다."}`
result 배열에 위 값을 넣어준다
3. 최종 result 값 리턴
카카오 문제를 풀다보니 느끼는 건데 문제가 참 친절하다. 혹시 이해 못할까봐 구구절절 ㅋㅋㅋㅋ
이 문제는 고유 id를 이용, 가장 최근 닉네임이 채팅방에 표시되도록 record 기록을 만들어내는 문제였다.
Enter 와 Change 는 항상 닉네임이 포함되어있는 string 값이다.
고로 Leave를 제외, record 배열을 순회하면서, 객체에 userId 를 키로, 닉네임을 값으로 저장한 후
그 유저가 방을 나갔다가 다시 들어온다거나(Enter), 닉네임을 변경한다거나(Change) 이후 이력이 있으면 새로운 닉네임으로 값을 계속 재할당하면서 최종적으로 userId라는 키에 가장 최근 닉네임 값이 담길 수 있도록 처리했다.
오픈채팅방에 유저의 입출기록만 필요하기에 닉네임 변경 이력(Change)을 제외한 데이터에 대해 가공 후 result 배열에 추가 해줬다.
풀이
function solution(record) {
const result = [];
let obj = {};
record.forEach((msg) => {
const arr = msg.split(" ");
const userId = arr[1];
if (arr[0] !== "Leave") {
obj[userId] = arr[2];
}
})
record.forEach((msg) => {
const arr = msg.split(" ");
const userId = arr[1];
if (arr[0] !== "Change") {
const text = `${obj[userId]}님이 ${arr[0] === "Enter" ? "들어왔습니다." : "나갔습니다."}`
result.push(text);
}
})
return result
}
시간 복잡도 : O(n)
반응형
'Algorithm > Algorithm Study' 카테고리의 다른 글
[프로그래머스] lv3 2019 카카오 블라인드_ 추석 트래픽 (0) | 2021.07.18 |
---|---|
[프로그래머스] 2019 카카오 인턴쉽 _ 크레인 인형뽑기 (0) | 2021.07.18 |
[프로그래머스] 2020 KAKAO 블라인드 _ 문자열 압축 (0) | 2021.07.11 |
[프로그래머스] 2021 KAKAO 블라인드 _ 메뉴 리뉴얼 (0) | 2021.07.04 |
[프로그래머스] 2021 KAKAO BLIND _ 신규 아이디 추천 (0) | 2021.07.03 |