[Python] 프로그래머스 - 오픈채팅방
학교에서 진행하는 수업에서 주어진 문제를 풀어보았다.
문제의 난이도는 프로그래머스 기준 레벨 2이다.
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42888
문제 설명
이번 문제는 카카오톡 채팅방에서 '[닉네임]님이 들어왔습니다.', '[닉네임]님이 나갔습니다.'와 같은 메세지가 나타나는 상황에 대하여 어떤 유저가 들어오고 나갔는지 출력하는 문제이다. 이 때, 사용자가 닉네임을 변경하는 상황을 고려해야 하기 때문에 문제 난이도가 조금 높아졌다.
문제 분석
채팅방에서 닉네임을 변경하는 방법은 총 두 가지 방법이 있다.
- 채팅방을 나간 후, 새로운 닉네임으로 들어오기
- 채팅방에서 닉네임을 변경하기
닉네임을 변경하게 된 경우, 기존에 채팅방에 출력되어 있던 모든 메세지 또한 변경된 닉네임을 기준으로 변경된다. 예를 들어 '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에 저장된 닉네임으로 "나갔다"라고 처리하면 문제가 해결된다.
- 먼저 최종적으로 사용되는 [유저 아이디]에 대한 [닉네임]을 저장한다.
- [유저 아이디]에 대한 [닉네임]을 이용해 '입장하였습니다', '나갔습니다' 등의 문자열을 생성한다.
전체 코드는 아래와 같다.
전체 코드
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