[코테] 프로그래머스 파이썬 Lv2. 오픈채팅방
카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다.
채팅방에 들어오고 나가거나, 닉네임을 변경한 기록이 담긴 문자열 배열 record가 매개변수로 주어질 때, 모든 기록이 처리된 후, 최종적으로 방을 개설한 사람이 보게 되는 메시지를 문자열 배열 형태로 return 하도록 solution 함수를 완성하라.
코딩테스트 연습 - 오픈채팅방 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

로그 중 Enter와 Leave는 메시지가 남지만 Change의 경우에는 특정 메시지가 표시되지 않는 점을 이용하였다.
먼저 record를 돌면서 Change가 들어오면(유저 아이디와 닉네임은 알파벳 대문자, 소문자, 숫자로만 이루어져있고 이후 반복문을 돌기 위해서는 순서는 유지해야 했기 때문에) "!"을 answer에 넣어줬다.
그후 닉네임이 변하는 경우를 대비하여 딕셔너리를 통해 Change 시 해당 키값의 value를 바꿔주었고, Enter 시에는 해당 키값이 딕셔너리에 없는 경우에만 키와 value를 저장하는 방식을 사용하였다.
반복문을 하나 더 사용하여 만들어진 딕셔너리에 해당하는 키값에 대한 최종 닉네임을 answer에 추가해주고 "!"가 포함된 요소는 제거해주었다.
특이한 점은 반복문을 통해 "!"을 제거하는 방법을 사용했을 때는 시간초과 및 틀림 표시를 확인할 수 있었지만 리스트 컴프리헨션을 사용하니 해당 문제 없이 해결할 수 있었다. 반복문 말고 코드의 수도 줄이고 성능을 높이는 리스트 컴프리헨션 등을 추가 공부하기로 했다.
def solution(record):
answer = []
ids={}
dicts={"Enter":"님이 들어왔습니다.","Leave":"님이 나갔습니다.","Change":""}
for i in record:
check=i.split()
if len(dicts[check[0]])==0:
answer.append("!")
else:
answer.append(dicts[check[0]])
if check[0]=="Change":
ids[check[1]]=check[2]
elif check[1] not in dicts and check[0]=="Enter":
ids[check[1]]=check[2]
for i in range(len(record)):
check=record[i].split()
answer[i]=ids[check[1]]+answer[i]
# for i in answer:
# if "!" in i:
# answer.remove(i)
# 리스트 컴프리헨션을 사용하여 '!'를 포함하는 요소를 제거
answer = [item for item in answer if '!' not in item]
return answer