def solution(record):
answer = []
check = []
userId = {}
name = []
for r in range(len(record)):
c = record[r].split(' ')[0]
u = record[r].split(' ')[1]
# 입장, 퇴장일 때
if c != "Change" :
# 입장일 때
if c == "Enter" :
n = record[r].split(' ')[2]
# 앞에서 저장했던 사용자일 때
if u in userId :
for i in range(len(userId[u])) :
# 채팅방을 나간 후, 새로운 닉네임으로 다시 들어왔을 수도 있으므로
name[userId[u][i]] = n
# 퇴장일 때
else :
# userId에 저장된 사용자 아이디의 맨 처음 인덱스
n = name[userId[u][0]]
# 닉네임 변경일 때
else :
n = record[r].split(' ')[2]
# 저장된 사용자가 아닐 경우
if u not in userId :
# 새롭게 추가
userId[u] = [r]
else :
# 저장된 사용자일 경우 userId에 저장된 인덱스를 바탕으로 닉네임 바꿔주기
for i in range(len(userId[u])) :
name[userId[u][i]] = n
name.append(n)
check.append(c)
# userId에 저장된 사용자
try :
tmp = userId[u]
tmp.append(r)
userId[u] = tmp
# userId에 저장되지 않은 사용자
except :
userId[u] = [r]
for i in range(len(check)) :
# 닉네임 변경은 출력 X
if check[i] == "Change" :
continue
checkEnter = "들어왔습니다."
if (check[i] == "Leave") :
checkEnter = "나갔습니다."
s = name[i] + "님이 " + checkEnter
answer.append(s)
return answer
처음에 코드를 작성하고 제출했을 때 두 개빼고 모든 테스트 케이스가 런타임 에러가 발생했다.
질문하기에 어떤 분이 감사하게도 본인이 고쳐서 해결한 에러에 관해 설명을 해주셔서 문제를 해결할 수 있었다.
# 퇴장일 때 else : # userId에 저장된 사용자 아이디의 맨 처음 인덱스 n = name[userId[u][0]]
코드 제출을 완료하고 주석을 작성하면서 의문이 든 부분이 있었다.
굳이 n을 새로 가져올 필요가 있나 생각해서 지워서 재제출했지만, 에러가 발생했고 다시 코드를 살펴 본 후 이해할 수 있었다.
퇴장일 때 입력은 "Leave uid1234" 이고, 사용자 아이디만 받아온다.
그러므로 사용자 닉네임이 필요한데, userId에 저장된 사용자 아이디를 바탕으로 닉네임을 불러올 수 있는 것이다.
여기서 만약 이미 채팅방에 있던 사람이라 입장 기록이 남지 않은 경우는 어떻게 해야하나 생각했다.
하지만 출력할 때 무조건 닉네임이 필요하므로, 기존에 있던 사람이 퇴장하기 전에 무조건 닉네임을 바꿀 것이라고 생각했다. 입장 기록이 없는 기존에 있던 사람의 닉네임을 받아오려면 그 방법 밖에 없기 때문이다. 그래서 위와 같이 코드를 작성했다.