Just Fighting
[프로그래머스] 오픈채팅방 본문
https://programmers.co.kr/learn/courses/30/lessons/42888
<문제 설명>
오픈채팅방에 닉네임을 정해서 들어올 수 있다.
채팅방에서 닉네임을 변경하는 방법은 ①나갔다가 들어오거나 ②닉네임을 변경하는 방법 2가지이다.
이 과정에서 메세지가 쌓이는데, "00님이 들어왔습니다", "00님이 나갔습니다"라는 메세지들이 쌓인다.
이때 닉네임이 바뀌면 이전에 쌓인 메세지 속 닉네임도 다 바뀌어야한다.
맨 마지막에 메세지를 확인할 때 보게되는 메시지들을 return하면 되는 문제다.
Enter [유저아이디] [닉네임] -> 입장
Leave [유저아이디] -> 퇴장
Change [유저아이디] [닉네임] -> 닉네임 변경
입력 데이터인 배열 record의 위와 같은 문자열데이터를 가진다.
<문제 이해>
record 속의 문장이
Enter로 시작되면 "[유저아이디]님이 들어왔습니다"
Leave로 시작되면 "[유저아이디]님이 나갔습니다"
를 저장할 수 있는 리스트를 하나 만들고,
유저의 닉네임을 저장할 수 있는 딕셔너리를 하나 만들어서
마지막에 최종 닉네임을 이용하여 [유저아이디]를 [닉네임]으로 바꾸면 되겠다고 생각했다.
<문제 풀이>
def solution(record):
answer = []
msg = []
user = {}
for re in record:
words = re.split()
if words[0]=="Enter":
msg.append(words[1]+"님이 들어왔습니다.")
user[words[1]] = words[2]
elif words[0]=="Leave":
msg.append(words[1]+"님이 나갔습니다.")
else:
user[words[1]] = words[2]
for ans in msg:
uid = ans[0:ans.find("님")]
ans = ans.replace(uid,user[uid])
answer.append(ans)
return answer
코드를 짜다보니 msg에 문장을 저장할 때 한 문장으로 저장하니까
맨 마지막에 [유저아이디]를 [닉네임]으로 바꿀 때 코드가 너무 복잡해지고 어려웠다.
<풀이 개선>
def solution(record):
answer = []
msg = []
user = {}
for re in record:
words = re.split()
if words[0]=="Enter":
msg.append([words[1],"님이 들어왔습니다."])
user[words[1]] = words[2]
elif words[0]=="Leave":
msg.append([words[1],"님이 나갔습니다."])
else:
user[words[1]] = words[2]
for ans in msg:
answer.append(user[ans[0]]+ans[1])
return answer
다른 사람의 풀이를 보다가 위에서 말한 복잡함을 해결할 수 있는 방법을 찾았다.
바로 list를 사용하는 것이다. "[유저아이디]님이 들어왔습니다" 이렇게 저장하는 방법이 아니라
[[유저아이디], "님이 들어왔습니다"]로 저장하면 닉네임으로 바꾸는 데 훨씬 간결한 코드를 사용할 수 있었다.
'Algorithm > 코딩테스트 연습' 카테고리의 다른 글
[프로그래머스] 키패드 누르기 (0) | 2022.01.12 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 (0) | 2022.01.11 |
[프로그래머스] 신규 아이디 추천 (0) | 2022.01.09 |
[프로그래머스] 문자열 압축 (0) | 2022.01.07 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2022.01.06 |