Agorithm/프로그래머스
프로그래머스 Level 2 오픈채팅방
kimjinho1
2022. 6. 16. 02:08
728x90
반응형
문제 상황에 맞는 적절한 자료구조를 생성하고 활용해야 되는 문제다.
카카오 코딩테스트 초반 문제들 특징인 것 같다.
나름 잘 풀었다고 생각했으나 훨씬 좋은 풀이가 있었기에 두 번째 풀이를 추가했다.
풀이 1
record를 따라 유저의 id와 이름을 기록한 딕셔너리인 user_dic, 유저 id와 출력돼야 하는 메시지들이 담긴
리스트인 msg_li를 만들어줬다. 아래와 같은 느낌이다.
msg_li에서 메시지 부분을 유저 id에 매칭 되는 이름으로 수정한 결과를 담은 리스트를 반환해주면 끝이다.
-> [msg.replace(user_id, user_dic[user_id]) for user_id, msg in msg_li]
def solution(records):
user_dic = {}
msg_li = []
for record in records:
li = record.split()
if li[0] == "Enter":
command, user_id, user_name = li
user_dic[user_id] = user_name
msg_li.append([user_id, f"{user_id}님이 들어왔습니다."])
elif li[0] == "Leave":
command, user_id = li
msg_li.append([user_id, f"{user_id}님이 나갔습니다."])
else:
command, user_id, user_name = li
user_dic[user_id] = user_name
ans = [msg.replace(user_id, user_dic[user_id]) for user_id, msg in msg_li]
return ans
풀이 2
지금 첫 번째 반복문을 보면 Enter와 Change의 경우일 때 중복인 코드가 있는데,
이유는 내가 굳이 필요 없는 자료구조인 msg_li를 생성하고 msg_li를 통해 ans를 완성하려고 했기 때문이다.
msg_li를 생성하지 않고, 그냥 user_dic을 첫 반복문에서 완성하고 두 번째 반복문에서 바로 ans를 완성하면 된다.
위의 방식으로 짠 결과 코드가 훨씬 간단해졌다. printer는 두 번째 반복문에 조건문을 넣기 싫어서 만들었다.
def solution(records):
user_dic = {}
printer = {"Enter": "님이 들어왔습니다.", "Leave": "님이 나갔습니다."}
ans = []
for record in records:
li = record.split()
if li[0] in ["Enter", "Change"]:
user_dic[li[1]] = li[2]
for record in records:
li = record.split()
if li[0] != "Change":
ans.append(user_dic[li[1]] + printer[li[0]])
return ans
728x90
반응형