[프로그래머스 : 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;
}

좋은 웹페이지 즐겨찾기