티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 접근 방식
- 닉네임은 변경될 수 있으므로, 불변하는 아이디로 출력 메시지를 완성한 이후에 아이디를 닉네임으로 교체하자.
따라서 코드는 크게 (1) 아이디로 메시지를 생성하는 부분과 (2) 메시지 내 아이디를 닉네임으로 교체하는 부분으로 나뉜다. (2) 과정에서 아이디에 해당하는 닉네임을 찾을 수 있도록 key가 아이디이고, value가 닉네임인 users 딕셔너리를 생성할 필요가 있다. users는 (1) 과정에서 Enter거나 Change일 때 users[아이디] = 닉네임 코드를 실행하여 생성할 수 있다. (1) 과정 동안 닉네임이 여러 번 변경되다가, (1) 과정이 끝나고나면 users에는 각 아이디의 최종 닉네임이 저장된다.
2. 정답 코드
def solution(record):
#make_histories_with_uid
messages = []
users = dict()
for r in record:
r = r.split() # 0: Enter/Change/Leave, 1: uid, 2: name
if r[0] == "Enter":
users[r[1]] = r[2]
messages.append(f'{r[1]}님이 들어왔습니다.')
elif r[0] == "Change":
users[r[1]] = r[2]
else:
messages.append(f'{r[1]}님이 나갔습니다.')
#change_uid_to_name
answer = []
for msg in messages:
i = msg.index('님')
uid = msg[:i]
answer.append(msg.replace(uid, users[uid]))
return answer
3. 개선 사항
위 코드에서 아쉬운 점은 출력 메시지를 담는 리스트를 messages와 answer로, 두 개를 사용한다는 것이다. 만약 각 아이디의 최종 닉네임을 알고 있다면, 곧 바로 최종 메시지를 담는 1개의 리스트만 있으면 된다. 그렇다면 미리 users 딕셔너리를 만들 순 없을까? 이를 고민하다가, 다음과 같은 코드를 떠올릴 수 있었다.
users = {r.split()[1]: r.split()[2] for r in record if r.split()[0] in ['Enter', 'Change']}
record에서 Enter이거나 Change인 경우에만 users 딕셔너리에 아이디와 닉네임을 추가한다.
이때 key는 중복을 허용하지 않는다. 예를 들어 users가 { 123: "Ryan" }일 때 users에 { 123: "Prodo" }을 추가하려고 한다면 그 결과는 위 그림처럼 { 123: "Prodo" }이다. 이 원리로 인해 users에는 각 아이디의 최종 닉네임이 저장된다.
따라서 새로 개선한 코드는 다음과 같다.
def solution(record):
users = {r.split()[1]: r.split()[2] for r in record if r.split()[0] in ['Enter', 'Change']}
answer = []
for r in record:
r = r.split()
if r[0] == 'Enter':
answer.append(f'{users[r[1]]}님이 들어왔습니다.')
elif r[0] == 'Leave':
answer.append(f'{users[r[1]]}님이 나갔습니다.')
return answer
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [1차] 비밀지도 파이썬 정답 코드 (0) | 2023.06.17 |
---|---|
[프로그래머스] 수식 최대화 파이썬 정답 코드 (0) | 2023.06.16 |
[프로그래머스] [1차] 캐시 파이썬 정답 코드 (0) | 2023.06.15 |
[프로그래머스] 튜플 파이썬 정답 코드 (0) | 2023.06.15 |
[프로그래머스] 신고 결과 받기 파이썬 정답 코드 (0) | 2023.06.14 |