문제
내 코드
def solution(record):
#배열 띄어쓰기 단위로 분리
arr = [record[i].split(" ") for i in range(len(record))]
answer = []
for j in range(len(arr)):
if (arr[j][0] == "Enter"):
answer.append([arr[j][1],"님이 들어왔습니다."])
elif (arr[j][0] == "Leave"):
answer.append([arr[j][1],"님이 나갔습니다."])
#바뀐 최신 닉네임을 저장하기 위해, 배열을 마지막부터 돌려서 처음 나오는 아이디와 닉네임만 저장함
id_list = {}
for k in range(len(arr)-1, -1, -1):
if (len(arr[k]) == 3):
if (arr[k][1] not in id_list):
id_list[arr[k][1]] = arr[k][2]
#똑같은 아이디들을 최신 닉네임으로 변경함
for m in range(len(answer)):
if answer[m][0] in id_list:
answer[m][0] = id_list[answer[m][0]]
answer[m] = "".join(answer[m])
return answer
풀이
- list comprehension을 사용하여 record를 띄어쓰기 단위로 분리한다.
- 안내문 출력을 위해, 아이디와 안내문구를 2차원 리스트로 추가한다.
(change는 필요 없으므로 if-elif 문을 사용하여 걸러냈다.)
- 닉네임 변경을 반영하기 위해, for문을 거꾸로 돌리고, 첫(가장 최신) 아이디와 닉네임만 딕셔너리에 추가한다. (리스트로 만들어도 상관없는데 뭐가 더 효율적인지는 모르겠다)
(leave에는 닉네임 정보가 없으니 문자열 길이를 사용하여 걸러냈다)
- answer와 id_list를 비교하여, 아이디가 같으면 닉네임으로 변경하고, join을 사용하여 합쳐준다.
효율적인 코드
def solution(record):
answer = []
namespace = {}
printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
arr = [record[i].split(" ") for i in range(len(record))]
for r in arr:
if r[0] in ['Enter', 'Change']:
namespace[r[1]] = r[2]
for r in arr:
if r[0] != 'Change':
answer.append(namespace[r[1]] + printer[r[0]])
return answer
피드백
- 안내 메시지를 for을 사용하여 따로 저장했는데, 여기서는 dictionary를 만들어서 간소화했다.
배운 것
- 딕셔너리는 중복을 허용하지 않고, 똑같은 키가 들어오면 값을 최신 값으로 바꿔준다.