출처: 프로그래머스
주소: https://programmers.co.kr/learn/courses/30/lessons/42888
코딩테스트 연습 - 오픈채팅방
오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오
programmers.co.kr
[문제 설명]
오픈채팅방에서 사용자들이 3가지 동작을 할 수 있다. 'Enter', 'Leave', 'Chage'가 있다.
- 'Enter'는 오픈채팅방에 입장하는 것으로 '[사용자의 닉네임]님이 들어왔습니다.'가 기록으로 남는다.
- 'Leave'는 오픈채팅방에 퇴장하는 것으로 '[사용자의 닉네임]님이 나갔습니다.'가 기록으로 남는다.
- 'Change'는 오픈채팅방에서 사용하는 사용자의 닉네임을 변경하는 것이다.
오픈채팅방에서 사용자의 닉네임을 변경할 수 있는 경우는 2가지이다.
1. 오픈채팅방을 퇴장 후에, 다른 닉네임으로 다시 입장하는 경우
2. 오픈채팅방에서 Change 동작을 통해 닉네임을 변경하는 경우
오픈채팅방에서 사용자가 닉네임을 변경한 경우에는 오픈채팅방에서 기록된 해당 사용자의 닉네임을 변경된 닉네임으로 변경해야한다.
[예시]
1. 'A'가 들어왔다가 나갔다가 'B'로 들어온 경우
- 'A'님이 들어왔습니다. --> 'B'님이 들어왔습니다.
- 'A'님이 나갔습니다. --> 'B'님이 나갔습니다.
- 'B'님이 들어왔습니다. --> 'B'님이 들어왔습니다.
- A와 B가 같은 사람이기 때문에 다음과 같이 변경되어야 한다.
2. 1번 이후에 'C'가 입장하고 'B'가 'D'로 닉네임을 변경한 경우
- 'B'님이 들어왔습니다. --> 'D'님이 들어왔습니다.
- 'B'님이 나갔습니다. --> 'D'님이 나갔습니다.
- 'B'님이 들어왔습니다. --> 'D'님이 들어왔습니다.
- 'C'님이 들어왔습니다. --> 'C'님이 들어왔습니다.
[알고리즘]
(1) 반복문이 많은 알고리즘
1. 사용자가 동작을 할 때마다 동작, 사용자 id, 사용자 닉네임을 리스트에 저장
2. 'Enter'의 동작인 경우, 이전 사용자 id를 비교해서 같은 경우의 사용자 닉네임을 변경
3. 'Leave'의 동작인 경우, 이전 사용자 id를 비교해서 같은 경우의 사용자 닉네임을 찾고 저장
4. 'Change'의 동작인 경우, 이전 사용자 id를 비교해서 같은 경우 사용자 닉네임을 변경
- 위와 같이 처음에 구현을 하였는데, for문이 많아서 그런지 모든 테스트 케이스를 만족하지 못하고 시간 초과가 났다.
(2) 딕셔너리를 사용한 알고리즘
1. 사용자가 동작을 할 때마다, 동작, 사용자 id, 사용자 닉네임을 commands 리스트에 저장
2. 'Enter'의 동작인 경우, {사용자 id: 사용자 닉네임} 으로 딕셔너리에 저장
3. 'Leave'의 동작인 경우, continue
4. 'Change'의 동작인 경우, {사용자 id: 사용자 닉네임} 으로 딕셔너리에 저장
5. commands 리스트를 반복
5-1) 'Enter': 사용자 id를 키를 가지는 딕셔너리의 value인 사용자 닉네임을 가져와서 출력
5-2) 'Leave: 사용자 id를 키를 가지는 딕셔너리의 value인 사용자 닉네임을 가져와서 출력
5-3) 'Change': continue
- 위와 같이 딕셔너리를 이용하여 코드를 구현하니까, 코드 길이도 짧고 반복문도 적어서 해결할 수 있었다.
[전체 코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
def solution(record):
answer = []
commands = []
uid_nick = {}
for r in record:
info = r.split(sep=' ')
commands.append([info[0], info[1]])
# 입장
if info[0] == 'Enter':
uid_nick[info[1]] = info[2]
# 퇴장
elif info[0] == 'Leave':
continue
# 변경
elif info[0] == 'Change':
uid_nick[info[1]] = info[2]
# commands 출력
for command in commands:
if command[0] == 'Enter':
answer.append(uid_nick[command[1]]+'님이 들어왔습니다.')
elif command[0] == 'Leave':
answer.append(uid_nick[command[1]]+'님이 나갔습니다.')
elif command[0] == 'Change':
continue
return answer
|
cs |
[느낀점]
- 파이썬은 느리니까 반복문을 최소한으로 사용하자.
'알고리즘' 카테고리의 다른 글
가장 큰 수 (0) | 2021.08.02 |
---|---|
약수의 개수와 덧셈 (0) | 2021.07.16 |