백준(BOJ) 시뮬레이션 문제집: 줄서기(골드 5)
문제 출처: https://www.acmicpc.net/problem/17178
17178번: 줄서기
아이즈원의 팬인 시온이는 드디어 티켓팅에 성공하여 콘서트를 갔다. 콘서트장에 일찍 도착한 시온이는 기대하며 입장을 위해 줄을 섰다. 하지만 아이즈원의 인기대로 시온이를 포함한 많은
www.acmicpc.net
1. 알고리즘
문제 설명대로만 풀면 된다. 데이터 참조 인덱스 체크 부분이 좀 귀찮고, 알고리즘 자체는 쉬웠던 문제
- 입력받은 한 줄의 티켓 데이터를 (구역, 번호)데이터로 나누어 deque, list형식으로 deque과 list에 넣어줌.
- 위에서 만든 티켓 리스트를 정렬하여 전체 티켓의 입장 순서를 나열한 list를 만듦.
- 티켓 입장 순서 list에 데이터가 존재하는 동안(=입장해야할 사람이 있는 동안) while 반복
- 기다리는 줄이 있고, 그 줄의 가장 앞 줄이 있고, 그 앞 줄의 맨 앞 사람이 입장해야 하는 사람
- 입장 순서 list의 맨 앞 사람 입장, 기다리는 줄 가장 앞 줄의 맨 앞 사람 입장
- 대기 공간에 사람이 있고, 대기 공간의 가장 최근 사람이 입장해야 하는 사람
- 입장 순서 list의 맨 앞 사람 입장, 대기 공간 가장 마지막 사람 입장
- 기다리는 줄 맨 앞, 대기 공간 맨 마지막 모두 입장해야 하는 사람이 아닌 경우
- 기다리는 줄 사람이 없다면 while문 break
- 기다리는 줄의 가장 앞 줄의 맨 앞 사람을 대기공간으로 이동
- 기다리는 줄이 있고, 기다리는 줄의 맨 앞 줄이 없고, 줄이 2줄 이상인 경우
- 기다리는 줄의 0번 빈 deque을 삭제
- 기다리는 줄이 있고, 그 줄의 가장 앞 줄이 있고, 그 앞 줄의 맨 앞 사람이 입장해야 하는 사람
- 입장 순서 list에 따라 데이터 출력
- 모두 입장했으면 GOOD 출력
- 입장하지 못한 티켓이 있으면 BAD 출력
2. 유의 사항
- 기다리는 줄은 0번 줄의 0번 사람만 이동(입장/대기공간 이동)가능
- 대기공간 사람은 콘서트 입장만 가능(기다리는 줄로 복귀 불가능)
3. 어려웠던 점, 해결 방법
4. 소스코드
자세한 설명은 주석 참조
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import sys
from collections import deque
input_func = sys.stdin.readline
if __name__ == '__main__':
N = int(*map(int, input_func().split()))
#기다리는 줄, 입장 순서 리스트 생성
waitings, entrance_order = deque(), []
for _ in range(N):
waiting_people = list(map(str, input_func().split()))
#split으로 구역, 번호 분리 후 임시 덱 생성
temp_waitings = deque()
for wp in waiting_people:
space, number = wp.split('-')
temp_waitings.append((space, int(number)))
#기다리는 줄은 덱 그대로, 입장 순서 리스트에는 리스트로
waitings.append(temp_waitings)
entrance_order.append(list(temp_waitings))
#(구역, 번호)데이터 sorting 후 deque 자료형
entrance_order = deque(sorted(sum(entrance_order, [])))
#콘서트 입장
temp = []
while entrance_order: #입장할 티켓만큼 반복
#현재 입장해야 하는 티켓
person = entrance_order[0]
#기다리는 줄 사람 확인
if waitings and waitings[0] and person == waitings[0][0]:
entrance_order.popleft()
waitings[0].popleft()
#대기 공간 사람 확인
elif temp and person == temp[-1]:
temp.pop()
entrance_order.popleft()
#입장해야 하는 티켓이 기다리는 줄과 대기 공간에 없는 경우
else:
#기다리는 사람이 없을 때, 더 이상 사람을 옮겨 줄 수 없으므로 종료
if not waitings:
break
#기다리는 줄 사람을 대기공간으로 이동
temp.append(waitings[0].popleft())
#초기 기다리는 줄이 두 줄 이상이고, 현재 가장 앞 줄이 비어 있는 경우
if waitings and not waitings[0] and N >= 2:
waitings.popleft()
#모든 티켓이 입장했으면 GOOD
if not entrance_order:
print('GOOD')
#입장하지 못한 티켓이 있으면 BAD
else:
print('BAD')
|
cs |
5. 고민
- entrance_order만들 때엔 그냥 extend 쓰면 될 걸 왜 저렇게 했나 몰라
'Algorithms > 백준' 카테고리의 다른 글
[백준_19640]화장실의 규칙 with Python (0) | 2021.06.16 |
---|---|
[백준_20165]인내의 도미노 장인 호석 with Python (0) | 2021.06.16 |
[백준_3709]레이저빔은 어디로 with Python (0) | 2021.06.01 |
[백준_21610]마법사 상어와 비바라기 with Python (0) | 2021.05.31 |
[백준_2174]로봇 시뮬레이션 with Python (0) | 2021.05.26 |
댓글