프로그래머스 - 오픈채팅방 [79]
https://programmers.co.kr/learn/courses/30/lessons/42888
닉네임을 변경하는 방법
- 채팅방을 나간 후, 새로운 닉네임으로 다시 들어간다.
- 채팅방에서 닉네임을 변경한다.
닉네임을 변경하면 기존에 채팅방에 출력되어 있던 메세지의 닉네임도 전부 변경됨
나갔던 유저가 닉네임을 바꾸고 다시 들어오면 기존 채팅방의 닉네임도 변경된다.
채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.
제한
다음은 record에 담긴 문자열에 대한 설명이다.
- 모든 유저는 [유저 아이디]로 구분한다.
- [유저 아이디] 사용자가 [닉네임]으로 채팅방에 입장
-
- “Enter [유저 아이디] [닉네임]” (ex. “Enter uid1234 Muzi”)
-
- [유저 아이디] 사용자가 채팅방에서 퇴장
-
- “Leave [유저 아이디]” (ex. “Leave uid1234”)
-
- [유저 아이디] 사용자가 닉네임을 [닉네임]으로 변경
-
- “Change [유저 아이디] [닉네임]” (ex. “Change uid1234 Muzi”)
-
- 첫 단어는 Enter, Leave, Change 중 하나이다.
- 각 단어는 공백으로 구분되어 있으며, 알파벳 대문자, 소문자, 숫자로만 이루어져있다.
- 유저 아이디와 닉네임은 알파벳 대문자, 소문자를 구별한다.
- 유저 아이디와 닉네임의 길이는
1이상10이하이다. - 채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못 된 입력은 주어지지 않는다.
생각

userId를 키로 하는 딕셔너리 두개를 만들자
행동리스트, 최종 닉네임이 value가 되도록
for문을 두번 돌리긴 하지만 결국 record의 최대 크기만큼만 돌아가기 때문에
100,000번 이하로 돌것이기 때문에 시간복잡도에는 문제가 없을 것 이라고 생각함
command에 따라 행동을 다르게 하여 구현, 파이썬은 switch가 없으므로 if문을 사용하여 구현하였다.
찾아본 사항
-
딕셔너리에 키가 존재하는지 확인하는 법
in 키워드 찾고자하는 키 in 딕셔너리
def solution(record):
nickname = dict()
behaviorList = dict()
index = 0
for x in record:
splitList = x.split(" ")
command = splitList[0]
userId= splitList[1]
if command == 'Enter':
nickname[userId] = splitList[2] # 들어올때 입력한 닉네임으로 설정
if userId in behaviorList:
#이미 추가 된 적이 있는 유저의 경우
behaviorList[userId].append((index,command)) #행동에 추가
else:
behaviorList[userId] = [(index,command)]
index += 1
if command== 'Leave':
# 유저의 행동 리스트에 나가기를 추가
behaviorList[userId].append((index, command))
index += 1
if command == 'Change':
#유저의 닉네임을 입력한 것으로 바꾸고
# 행동에 추가
nickname[userId] = splitList[2]
# behaviorList[userId].append((index, command))
# print(nickname)
# print(behaviorList)
answer = [""] * index #행동의 개수만큼 초기화
#원하는 형식으로 출력하여 answer에 추가
for userId in nickname:
for index, behavior in behaviorList[userId]:
if behavior == 'Enter':
answer[index] = nickname[userId] +"님이 들어왔습니다."
if behavior == 'Leave':
answer[index] = nickname[userId] +"님이 나갔습니다."
return answer
if __name__ == '__main__':
record = ["Enter uid1234 Muzi", "Enter uid4567 Prodo","Leave uid1234","Enter uid1234 Prodo","Change uid4567 Ryan"]
print(solution(record))