[프로그래머스 : Lv2] 오픈채팅방 (ft.카카오)
1st Try
- 방법 : 배열을 한번 돌면서 change일때 다시 또 배열을 처음부터 돌아서 해당 id의 닉네임 변경하려고 함
- 문제점 : 한번 돌면서 change일때마다 또 배열을 돌아야함
- 예상복잡도 : 최소 n제곱
2nd Try
- 방법 : 첫번째 방법에서 계속 id에 해당하는 닉네임을 찾기 위해 다시 배열을 도는 것이 비효율적이라고 생각
🔹 id에 해당하는 닉네임을 바로 접근하고 변경가능한 방법 고민 (split할 필요없이)
🔹 한번 돌때 id에 해당하는 닉네임을 객체로 저장하는 것이 효율적이라고 생각 (객체일 경우 접근이나 변경이O(1)이니깐)
🔹 예상 복잡도 : 2n (map이 두개여서)
- 결과 : 2개만 통과...? 테스트 코드는 통과
- 실패 이유 :
🔹 속도는 아닌 것 같음
🔹 답 : split를 해서 각각 controller, id, nickname으로 넣었는데 leave의 경우 nickname이 없어서 undefined가 들어감. 테스트코드의 경우 뒤에 같은 id가 enter로 있어서 undefined였던 것을 새로운 닉네임으로 변경할 수 있었음. 하지만 다른 테스트코드에서는 뒤에 enter가 다시 없는 경우 nickname이 계속 undefined인채로 유지가 되므로 실패가 뜬 것.
- 문제코드
record.map(item => { const [controller, id, nickname] = item.split(' '); nickObj[id] = nickname; })
- 해결코드
record.map(item => { const [controller, id, nickname] = item.split(' '); if (controller !== 'Leave') { nickObj[id] = nickname; } })
- undefined가 들어가는 것 확인
- 문제코드
최종코드
function solution(record) {
const nickObj = {};
const answer = [];
record.map(item => {
const [controller, id, nickname] = item.split(' ');
if (controller !== 'Leave') {
nickObj[id] = nickname;
}
})
record.map(item => {
const [controller, id, nickname] = item.split(' ');
switch(controller) {
case 'Enter':
answer.push(`${nickObj[id]}님이 들어왔습니다.`);
break;
case 'Leave':
answer.push(`${nickObj[id]}님이 나갔습니다.`);
break;
case 'Change':
break;
}
})
return answer;
}
Author And Source
이 문제에 관하여([프로그래머스 : Lv2] 오픈채팅방 (ft.카카오)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rachel490/프로그래머스-Lv2-오픈채팅방-ft.카카오저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)