문제) 프로그래머스 - 2019 카카오 공채 - 오픈채팅방
-> 코딩테스트 연습 - 오픈채팅방 | 프로그래머스 (programmers.co.kr)
① 나의 풀이
Dictionary 형태로 record의 유저 아이디와 닉네임을 취합하기 위해서 collections의 Counter 모듈을 이용하자. 각 record의 원소를 split 하여 order 리스트로 받아준다. record탐색을 두 번 해주는데, 첫 탐색에서 유저 아이디에 대한 최종 닉네임을 결정해주고 두 번째 탐색에서
유저 아이디에 대한 해당 기록을 answer 리스트에 넣어준다.
문제를 읽어보면 제약 사항에서 "채팅방에서 나간 유저가 닉네임을 변경하는 등 잘못된 입력은 주어지지 않는다"가 주어진다. 유저 아이디를 탐색할 때, 우리는 record에 담긴 문자열이 Enter인지 Change인지만 확인해 유저 아이디와 닉네임의 정보를 담은 dictionary를 업데이트해준다.
두 번째 탐색에서는 기록을 answer 리스트에 넣어준다. record에 담긴 문자열이 Change이면 기록에 영향을 주지 않기 때문에 Enter과 Leave일 때 유저 아이디에 해당하는 닉네임을 불러와 answer 리스트에 추가한다.
소스 코드)
from collections import Counter
def solution(record):
answer = []
info = Counter()
#첫 탐색
for line in record:
order = list(line.split())
if order[0] == 'Enter':
uid, name = order[1], order[2]
if uid in info.keys():
info[uid] = name
else:
info.setdefault(uid, name)
elif order[0] == 'Change':
uid, name = order[1], order[2]
info[uid] = name
#두 번째 탐색
for line in record:
order = list(line.split())
if order[0] == 'Enter':
uid, name = order[1], order[2]
answer.append(f"{info[uid]}님이 들어왔습니다.")
elif order[0] == 'Leave':
answer.append(f"{info[order[1]]}님이 나갔습니다.")
return answer
② 다른 사람 풀이
⊙ Simple is Best
def solution(record):
answer = []
namespace = {}
printer = {'Enter':'님이 들어왔습니다.', 'Leave':'님이 나갔습니다.'}
for r in record:
rr = r.split(' ')
if rr[0] in ['Enter', 'Change']:
namespace[rr[1]] = rr[2]
for r in record:
if r.split(' ')[0] != 'Change':
answer.append(namespace[r.split(' ')[1]] + printer[r.split(' ')[0]])
return answer
내 풀이와 알고리즘은 같지만 아주 간단하게 해결하였다. 보기 좋은 떡이 먹기도 좋다고 코드가 간결할수록 눈으로 디버깅하기도 쉬워 오류를 빠르게 해결할 수 있다. 더 간단하게 최적화하도록 하자.
반응형
'PS(Problem Solving) > 프로그래머스_Programmers' 카테고리의 다른 글
[프로그래머스] 2021 카카오 채용연계형 인턴십 - 숫자 문자열과 영단어 (파이썬) 문제 및 풀이 (0) | 2021.08.03 |
---|---|
[프로그래머스] 2021 Dev-Matching - 로또의 최고 순위와 최저 순위 (C++) 문제 및 풀이 (0) | 2021.06.03 |
[프로그래머스] 2019 카카오 공채 - 실패율 (파이썬) 문제 및 풀이 (2) | 2021.03.04 |
[프로그래머스] 2021 카카오 공채 - 메뉴 리뉴얼 (파이썬) 문제 및 풀이 (0) | 2021.02.06 |
[프로그래머스] 2021 카카오 공채 - 신규 아이디 추천 (파이썬) 문제 및 풀이 (0) | 2021.02.03 |
댓글