def solution():
answer = []
recordList = []
for oneVal in record:
recordList.append(oneVal.split())
memberList = []
leaveList = []
for oneVal in recordList:
if oneVal[0] == "Enter":
memberList.append((oneVal[1], oneVal[2]))
if oneVal[0] == "Leave":
for i in range(0, len(memberList)):
if memberList[i][0] == oneVal[1]:
memberList.remove(memberList[i])
leaveList.append(memberList[i][1])
break
if oneVal[0] == "Change":
for i in range(0, len(memberList)):
if memberList[i][0] == oneVal[1]:
memberList.remove(memberList[i])
memberList.append((oneVal[1], oneVal[2]))
break
for oneVal in recordList:
if oneVal[0] == "Enter":
for i in range(0, len(memberList)):
if memberList[i][0] == oneVal[1]:
answer.append(str(memberList[i][1])+"님이 들어왔습니다.")
break
if oneVal[0] == "Leave":
answer.append(str(leaveList.pop(0))+"님이 나갔습니다.")
return answer
입력 레코드 전부 split 하여 배열에 넣어둔다. 총 for loop 를 2번 돈다.
첫 번째 돌때는 사용자 ID와 사용자 닉네임을 저장해둔다 (변경까지)
두 번째 돌때는 이를 바탕으로 출력을 한다.
=> 런타임 에러
만약 입력 레코드가
record = ["Enter uid1234 Muzi", "Change uid1234 Muzi", "Leave uid1234", "Enter uid1234 Prodo"]
다음과 같을 때
Enter, Change 하고 나서 Change를 해야 하므로 이전에 있던 값을 지워주고 새로운 정보를 넣어준다. 하지만 이 때 memberList 배열에는 아무런 값도 없으므로 런타임 에러가 나온다.
결론적으로는 Dictionary를 써서 구현해야 한다.
def solution(record):
answer = []
actions = []
userDB = {}
recordList = []
for oneVal in record:
recordList.append(oneVal.split())
for oneVal in recordList:
if oneVal[0] in ("Enter", "Change"):
userDB[oneVal[1]] = oneVal[2]
actions.append((oneVal[0], oneVal[1]))
for a in actions:
if a[0] == 'Enter':
answer.append(f'{userDB[a[1]]}님이 들어왔습니다.')
elif a[0] == 'Leave':
answer.append(f'{userDB[a[1]]}님이 나갔습니다.')
return answer
생각하지 못했던 부분은 사용자 ID와 닉네임을 저장해둘 때 그냥 배열이 아니라 dict를 쓴다. 왜냐하면 어차피 사용자 ID 는 고유한 값이고 바뀌지 않는다. 닉네임 변경이 있어도 키 값인 사용자 ID는 변함없다. 로직은 위의 코드와 거의? 똑같다.