본문 바로가기

알고리즘/프로그래머스

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

[ 문제 ]

 


[출제 의도]

 

  • 해시 활용

[ 문제 풀이 ]

 

먼저, record를 순회하면서 '입장과 변경 기록'을 가지고 딕셔너리를 이용해 유저 아이디마다 최종 닉네임을 구하고,

'입장과 퇴장 기록'은 new_record를 만들어서 따로 저장합니다.

 

그다음, new_record를 순회하면서 채팅방에 출력할 메시지를 생성합니다.

이때 유저 아이디는 최종 닉네임을 사용하면 됩니다.

 


[ 정답 코드 ]

 

# 시간복잡도 O(N)으로 처리
from collections import defaultdict


def solution(record):
    name = defaultdict(str)
    order = []
    new_record = []

    # 닉네임 관리
    for datas in record:
        data = datas.split()
        if data[0] != "Leave":  # 닉네임 (입장, 변경)
            user_id, nick_name = data[1], data[2]
            name[user_id] = nick_name

        if data[0] == "Enter" or data[0] == "Leave":  # 메시지 (입장, 퇴장)
            new_record.append(data)

    # 메시지 출력
    for data in new_record:
        if data[0] == "Enter":  # 입장
            order.append("%s님이 들어왔습니다." % name[data[1]])

        elif data[0] == "Leave":  # 퇴장
            order.append("%s님이 나갔습니다." % name[data[1]])

    return order


print(solution(["Enter uid1234 Muzi",
          "Enter uid4567 Prodo",
          "Leave uid1234",
          "Enter uid1234 Prodo",
          "Change uid4567 Ryan"]))