프로그래밍/알고리즘 PS

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

코딩 제이티 2024. 5. 14. 14:30

학교에서 진행하는 수업에서 주어진 문제를 풀어보았다.

 

문제의 난이도는 프로그래머스 기준 레벨 2이다.

문제 링크

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

문제 설명

 이번 문제는 카카오톡 채팅방에서 '[닉네임]님이 들어왔습니다.', '[닉네임]님이 나갔습니다.'와 같은 메세지가 나타나는 상황에 대하여 어떤 유저가 들어오고 나갔는지 출력하는 문제이다. 이 때, 사용자가 닉네임을 변경하는 상황을 고려해야 하기 때문에 문제 난이도가 조금 높아졌다.

문제 분석

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

  1. 채팅방을 나간 후, 새로운 닉네임으로 들어오기
  2. 채팅방에서 닉네임을 변경하기

닉네임을 변경하게 된 경우, 기존에 채팅방에 출력되어 있던 모든 메세지 또한 변경된 닉네임을 기준으로 변경된다. 예를 들어 'A' 유저가 들어오고 'B' 유저가 나간 후 'B' 유저가 'C'로 닉네임을 변경하여 다시 방에 들어오면 'A님이 들어왔습니다.', 'C님이 나갔습니다.', 'C님이 들어왔습니다.'로 출력된다.

 

이 때 입력은 문자열 배열로, "Enter uid1234 Muzi"와 같은 형태로 주어진다.

첫 단어는 'Enter', 'Change', 'Leave' 중에 하나이다. 만약 'Enter'가 첫 글자인 경우 'Enter [유저 아이디] [닉네임]'이 주어지고, 'Change'가 첫글자이면 'Change [유저 아이디] [닉네임]'이 주어진다. 'Leave'가 첫 글자인 경우 'Leave [유저 아이디]'가 주어진다.

 

해당 문제에서 주어진 입력에 대하여 나타나는 출력은 'A님이 들어왔습니다.' ,'B님이 들어왔습니다'와 같은 문자열의 배열이다. 입력에 대한 최종 출력을 구하는 것이 우리가 해결해야 할 문제이다.

문제 풀이

 해당 문제를 풀 때, C++로 풀고자 하였으나 문자열을 split(공백을 기준으로 쪼개기)하는 데에 더욱 복잡한 방식을 사용해야 하여 파이썬으로 문제를 풀어보았다.

 

 먼저 name_dict라는 딕셔너리를 선언하고, 이 곳에 변경된 최종 [유저 아이디]에 대한 [닉네임]을 저장한다. for문을 통해 주어진 record에서 "Enter"와 "Change"에 대하여 닉네임을 name_dict에 저장하고, 최종적으로 다시 한 번 record를 순회하며 "Enter"에 대해서는 name_dict에 저장된 닉네임으로 들어왔다고 처리하고, "Leave"에 대해서는 name_dict에 저장된 닉네임으로 "나갔다"라고 처리하면 문제가 해결된다.

 

  1. 먼저 최종적으로 사용되는 [유저 아이디]에 대한 [닉네임]을 저장한다.
  2. [유저 아이디]에 대한 [닉네임]을 이용해 '입장하였습니다', '나갔습니다' 등의 문자열을 생성한다.

 

전체 코드는 아래와 같다.

전체 코드

def solution(record):
    answer = []
    
    name_dict = {}
    
    for r in record:
        splittedR = r.split()
        if splittedR[0] == "Enter":
            name_dict[splittedR[1]] = splittedR[2]
        elif splittedR[0] == "Change":
            name_dict[splittedR[1]] = splittedR[2]
    
    for r in record:
        splittedR = r.split()
        if splittedR[0] == "Enter":
            answer.append(f'{name_dict[splittedR[1]]}님이 들어왔습니다.')
        elif splittedR[0] == "Leave":
            answer.append(f'{name_dict[splittedR[1]]}님이 나갔습니다.')
    
    return answer