[프로그래머스] 2019 KAKAO 블라인드 _ 오픈 채팅방
Algorithm/Algorithm Study

[프로그래머스] 2019 KAKAO 블라인드 _ 오픈 채팅방

반응형

2021_07_11 문제풀이

문제 URL : https://programmers.co.kr/learn/courses/30/lessons/42888?language=javascript 

 

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

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

programmers.co.kr

 

문제

 

의사 코드

// 방을 개설한 사람이 보게 되는 최종 메시지를 문자열 배열 형태로 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)

 

 

반응형