티스토리 뷰

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

 

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

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

programmers.co.kr

문제 설명

오픈채팅방

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

신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.

"[닉네임]님이 들어왔습니다."

채팅방에서 누군가 나가면 다음 메시지가 출력된다.

"[닉네임]님이 나갔습니다."

채팅방에서 닉네임을 변경하는 방법은 다음과 같이 두 가지이다.

  • 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
  • 채팅방에서 닉네임을 변경한다.

 

입출력 예


문제 풀이

파이썬을 이용해서 풀면 간단하게 풀리는 문제이다.

(유저ID: 닉네임) 이라는 딕셔너리 형태로 메세지를 출력하기 전 유저 ID와 닉네임을 모두 최신화한다.

그렇게 되면 메세지를 출력하기 전, 모든 유저의 닉네임을 최신화된 상태로 가질 수 있다.

닉네임을 최신화하는 과정이 발생하는 조건은

 

1. 새로운 유저가 들어오는 경우 -> Enter

2. 유저가 닉네임을 바꾸는 경우 -> Change

 

총 2가지 조건이 있다. 둘 중 하나의 조건이라도 해당되면 닉네임을 최신화하면 된다.

 

 

출력하는 과정에서 생길 수 있는 조건은

 

1. 채팅방에 들어오는 경우 -> Enter

2. 채팅방을 나가는 경우 -> Leave

 

총 2가지 조건이 있다. 그러므로 Enter일때와 Leave일때로 분기하여 적절하게 출력하면된다.

 

def solution(record):
    answer = []
    client_dict = {} # (id, name)으로 딕셔너리 형태로 저장

    for data in record:
        data = data.split(' ')
        status = data[0]

        if status == 'Enter' or status == 'Change':
            uid = data[1]
            name = data[2]
            client_dict[uid] = name


    for data in record:
        data = data.split(' ')
        status = data[0]
        uid = data[1]
        if status == 'Enter':
            message = "{}님이 들어왔습니다.".format(client_dict[uid])
            answer.append(message)

        elif status == 'Leave':
            message = "{}님이 나갔습니다.".format(client_dict[uid])
            answer.append(message)
            
    return answer
댓글