문제


풀이
문제를 봤을 때 들었던 생각 : 닉네임을 변경해서 모든 메세지를 출력하려면, 메세지가 나올 record만 따로 저장을 하고, change나 enter가 들어왔을 때 닉네임을 업데이트 하면 되겠구나 ! 하고 생각했다.
from collections import defaultdict
def solution(record):
access_list = []
member_dict = defaultdict(str)
res = []
#access_list 저장, 멤버 이름 업데이트
for rec in record :
parts = rec.split()
#change, enter 경우
if len(parts) == 3 :
access, user_id, nickname = parts
#user_id에 맞는 닉네임 업데이트
member_dict[user_id] = nickname
#enter인 경우 access_list에 추가
if access == 'Enter' :
access_list.append([access, user_id])
#user_id에 맞는 닉네임 업데이트
member_dict[user_id] = nickname
#Leave인 경우
else :
access, user_id = parts
access_list.append([access, user_id])
#최종 메세지 업데이트
for access in access_list :
name = member_dict[access[1]]
if access[0] == 'Enter' :
message = f'{name}님이 들어왔습니다.'
res.append(message)
else :
message = f'{name}님이 나갔습니다.'
res.append(message)
return res
풀이 로직
1. 채팅방 출입만을 저장할 access_list 생성, 멤버들을 id로 구분할 id : nickname의 키 : 값 쌍을 가지는 member_dict 생성
2. record를 처음부터 끝까지 반복 시작
3. split()을 통해 나눴을 경우, change와 enter의 경우에는 인자가 3개가 나오고, leave의 경우에는 nickname이 안들어간 2개의 인자가 나오므로, len(parts)를 통해 3개의 인자가 나오는 경우부터 조치
4. enter과 change의 경우 둘 다 member의 id에 맞는 nickname을 update하므로 member dict 먼저 업데이트
5. enter의 경우 access_list에 추가
6. len(parts)가 2이면 leave인 경우이므로, access_list에 access와 user id 추가
-> 이렇게 access리스트와 member dict 생성
7. access_list에는 그럼 enter/leave와 user_id가 들어있으므로, enter인 경우와 leave인 경우 나누어서 res 리스트에 문자열 추가
Github Link ←
BackJoon-Programmers/프로그래머스/2/42888. 오픈채팅방 at main · jaeheonki/BackJoon-Programmers
Contribute to jaeheonki/BackJoon-Programmers development by creating an account on GitHub.
github.com
'Algorithm' 카테고리의 다른 글
| [프로그래머스] 프렌즈4블록 (1) | 2026.04.13 |
|---|---|
| [프로그래머스] 마법의 엘리베이터 (2) | 2026.04.13 |
| [프로그래머스] 프로세스 (0) | 2026.04.09 |
| [프로그래머스] 피로도 (0) | 2026.04.09 |
| [프로그래머스] 주식가격 (0) | 2026.04.09 |
