개발 공부/알고리즘 문제 풀이

[프로그래머스] 오픈채팅방

종범2 2020. 6. 9. 22:34

문제

프로그래머스 2019 KAKAO BLIND RECRUITMENT 오픈채팅방

https://programmers.co.kr/learn/courses/30/lessons/42888

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

언어

바스크립트(JavaScript)

 

접근방법

  1. aciontList은 Action은 유저 행동, Id는 유저 아이디인 객체로 이루어진 배열이다. nickObj은 유저 아이디를 key, 유저의 최근 닉네임을 value로 가지는 객체이다.
  2. record를 차례로 탐색한다.
  3. 행동이 Enter면 닉네임을 변경해야 하므로 nickObj에서 현재 유저의 아이디를 key로 하는 객체를 찾아 value를 들어올 때의 닉네임으로 업데이트한다. 또한 actionList에 Action은 유저행동, Id는 유저 아이디인 객체를 삽입한다.
  4. 행동이 Leave면 닉네임을 변경할 필요가 없다. actionList에 Action은 유저행동, Id는 유저 아이디인 객체를 삽입한다.
  5. 행동이 Change면 닉네임만 변경한다. nickObj에서 현재 유저의 아이디를 key로하는 객체를 찾아 value를 변경할 닉네임으로 업데이트한다
  6. 결과를 출력한다.

코드

function solution(record) {
    let answer = [];
    let actionList = [];
    let nickObj = {};
    for (let i=0; i<record.length; i++){
        let input = record[i].split(" ");
        if (input[0] ==='Enter'){
            // 닉네임 변경
            nickObj[input[1]] = input[2];
            // 들어온 행동 추가
            actionList.push({Action:input[0],Id:input[1]});
        }else if(input[0] ==='Leave'){
            // 나간 행동 추가
            actionList.push({Action:input[0],Id:input[1]});
        }else{
            // 닉네임 변경
            nickObj[input[1]] = input[2];
        }
    }
    // 결과 출력
    for (let i=0; i<actionList.length; i++){
        if (actionList[i].Action === 'Enter'){
            answer.push(`${nickObj[actionList[i].Id]}님이 들어왔습니다.`);
        }else{
            answer.push(`${nickObj[actionList[i].Id]}님이 나갔습니다.`);
        }
    }
    return answer;
}

복기

  1. 닉네임 데이터는 객체에, 행동 데이터는 배열에 따로 관리하지 않으면 문제가 복잡해진다. 이를 먼저 생각하지 않고 문제부터 바로 풀면 안 된다.
  2. 다행히 미리 다 생각하고 풀어서 헤매지는 않았다.