문제 링크 : https://www.acmicpc.net/problem/22234
1. 접근 방법
간단한 구현 문제인데, 출력을 어떻게 조정할지 많이 고민했다.
구현 과정은 각 손님의 남은 시간을 확인하고, 업무처리를 각각 상황에 맞게 시간을 사용하고, 사용한 시간만큼 출력할 리스트에 저장하면서 진행했다.
2. 풀이 코드
🖥python 코드
from collections import deque
import sys
input = sys.stdin.readline
MIIS = lambda: map(int, input().split())
N, T, W = MIIS()
# 처음 대기중 손님
guests = deque([tuple(MIIS()) for _ in range(N)])
M = int(input())
# 추가 들어올 손님
next_guests = sorted([tuple(MIIS()) for _ in range(M)], key=lambda x: -x[2])
# 지금 시간
time = 0
# 출력
output = []
while time < W:
# 가장 앞에 있는 손님
idx, left_time = guests.popleft()
# 남아 있는 시간 비교
# 더 많이 남아 있다면 T만큼만 하고 뒤로
if left_time > T:
# 시간 확인하여 출력
next_time = time + T
if next_time >= W:
output += [idx] * (W - time)
else:
output += [idx] * T
time = next_time
# 다음 줄설수 잇는 손님 확인
while next_guests:
# 남은 손님이 있고, 출입 시간이 되었을 때
if next_guests[-1][2] <= next_time:
guests.append(next_guests[-1][:2])
next_guests.pop()
else:
break
# 줄 가장 뒤로
guests.append((idx, left_time - T))
# T와 같거나 적게 남아 있으면 퇴장
else:
# 시간 확인하여 출력
next_time = time + left_time
if next_time >= W:
output += [idx] * (W - time)
else:
output += [idx] * left_time
time = next_time
# 다음 줄설수 잇는 손님 확인
while next_guests:
# 남은 손님이 있고, 출입 시간이 되었을 때
if next_guests[-1][2] <= next_time:
guests.append(next_guests[-1][:2])
next_guests.pop()
else:
break
# 은행 나가기
print(*output, sep='\n')
📕코드 해설
1. 가장 앞에 있는 손님을 확인한다.
2. 각 손님의 남은 시간과 한 번에 사용할 시간 T를 비교해서 사용한다.
3. 각 손님 별로 사용한 시간만큼 출력 리스트에 추가한다
4. 사용한 시간사이에 다른 손님이 들어오면 해당 손님들을 모두 추가하고,
5. 이전 손님을 가장 뒤에 추가하거나, 추가하지 않는다.
3. 생각 정리
처음에 추가할 손님도 deque로 선언 후, while next_guests로 확인하면서 진행했다.
예전에도 했던 실수인데, deque는 요소의 수에 따라 True/False가 바뀌지 않아서 고생했었는데, 이번에 또다시 실수했다.
이를 해결하기 위해서는 len(next_guests) > 0 방식으로 확인하거나, 이번 해결 코드처럼 리스트로 만들어 스택처럼 확인하면 된다.
'CS > 알고리즘 & 문제풀이' 카테고리의 다른 글
[Python] 백준 23259 Celebrity (0) | 2021.10.31 |
---|---|
[Python] 백준 23257 비트코인은 신이고 나는 무적이다 (0) | 2021.10.30 |
[Python] 백준 16888 루트 게임 (0) | 2021.10.28 |
[Python] 백준 3109 빵집 (0) | 2021.10.28 |
[Python] 백준 1461 도서관 (0) | 2021.10.27 |
댓글