프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42888
[나의 풀이]
⌛ 32분
def solution(record):
answer = []
acts = {'Enter':0,'Leave':1,'Change':2}
tmp = [] # 입장 : 0, 퇴장:1, 변경:2
changes = {}
for rec in record:
rec = rec.split(" ")
act, uid = rec[0], rec[1]
if acts[rec[0]]==0 :
tmp.append((acts[act],uid))
name = rec[2]
changes[uid] = name
elif acts[rec[0]]==1:
tmp.append((acts[act],uid))
else:
name = rec[2]
changes[uid] = name
for x in tmp:
act , uid = x
if act==0:
answer.append(changes[uid]+"님이 들어왔습니다.")
else:
answer.append(changes[uid]+"님이 나갔습니다.")
return answer
유저ID와 닉네임이 포함된 입력된 오픈 채팅방 입/퇴장 내역과 닉네임 변경 내역(record)가 주어지고 유저가 닉네임을 변경할 수 있는 상황일 때,
최종적으로 변경된 오픈 채팅방 입/퇴장 내역을 구하는 문제입니다.🐹🐹🐹
유저가 할 수 있는 행동 중 'Enter', 'Leave' 일 때, 행동과 고유 유저ID를 순서대로 기억(tmp)하고 유저의 행동이 'Change'일 때는 유저가 변경한 닉네임을 초기화하여 저장해주었습니다.
이후 tmp를 돌며 마지막으로 변경한 닉네임을 토대로 유저별 입/퇴장 내역을 구하였습니다.
[다른 사람의 풀이1]
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
'나의 풀이'처럼 유저의 최종 닉네임을 기억하고 유저의 행동이 'Enter' 나 'Leave'일 때, 최종 닉네임을 기준으로 입/퇴장 내역을 기록한 방법입니다.
[다른 사람의 풀이2]
def solution(record):
answer = []
id_dict = dict() # id에 해당하는 이름 정보
commands = [list(r.split()) for r in record] # record의 데이터들을 공백 기준으로 분리
for command in commands:
if command[0] == 'Enter' or command[0] == 'Change': # id에 해당하는 닉네임 정보 생성 혹은 업데이트
id_dict[command[1]] = command[2]
for command in commands:
if command[0] == 'Enter':
answer.append(id_dict[command[1]] + "님이 들어왔습니다.")
elif command[0] == 'Leave':
answer.append(id_dict[command[1]] + "님이 나갔습니다.")
return answer
똑같이 유저의 최종 닉네임을 기억한 뒤, 고유 유저ID별 최종 닉네임을 기준으로 입/퇴장 내역을 순서대로 append한 방식입니다.🐣🐣🐣
감사합니다.