즐거운 PS 👩‍💻🥰

[백준-파이썬] 22234: 가희와 은행

dalin❤️ 2021. 10. 26. 21:39

문제 보러 가기!

문제를 꼼꼼히 읽고 구현하려고 했다~

큐를 하나 만들어서 은행 대기 줄을 구현했다. 이미 줄 서있는 사람들은 이 큐에 넣고 시작했고, 나중에 오는 사람들은 시간이 될 때 큐 안에 넣었다.

1. 큐의 맨 앞에 있는 고객을 만나기

2. 고객 업무 처리하기

1) 고객에게 필요한 시간이 T보다 크거나 같으면 T초 동안 그 고객을 만났다. 시간을 1초씩 움직이면서, 그 고객 아이디를 출력했고, 만약에 그때 은행에 들어온 고객이 있는지 체크하고 있으면 큐 안에 넣어주었다.

=> 다 끝난 후에, 고객이 다시 뒤에 가서 서야 하면(필요한 시간이 T보다 컸으면) 큐의 맨 뒤에 넣었다.

2) 고객에게 필요한 시간이 그보다 작으면 필요한 시간만큼만 고객을 만나면 된다. 이때도 시간을 1초씩 움직이면서, 그 고객 아이디를 출력하고, 그때 은행에 들어온 고객이 있으면 큐 안에 넣었다.

* 2번을 진행하면서 시간을 1초씩 움직일 때, 매번 W초보다 작은지 체크했다. 

3. 다시 1번으로 돌아가기

 

import collections
import sys

input = sys.stdin.readline

MIIS = lambda: map(int, input().split())

N, T, W = MIIS()

bank_line = collections.deque()  # 은행 대기 줄

# 영업 시작할 때 대기 줄에 이미 있는 손님
for _ in range(N):
    p, t = MIIS()
    bank_line.append((p, t))

# 오픈 후에 오는 손님
M = int(input())
after_customers = list()
for _ in range(M):
    p, t, c = MIIS()
    after_customers.append((c, p, t))
after_customers.sort()
after_customers = collections.deque(after_customers)

now = 0
while bank_line and now < W:
    # 맨 앞의 고객 만나기
    curr_customer_p, curr_customer_t = bank_line.popleft()

    if curr_customer_t >= T:  # 고객이 필요한 시간이 T보다 크거나 같으면
        i = 0
        while i < T and now < W:  # T 초 동안 그 고객을 만나기
            print(curr_customer_p)
            now += 1
            i += 1

            # 이 시각 이전에 은행에 들어온 고객이 있으면 줄 서게 하기
            while after_customers and now == after_customers[0][0]:
                tmp_c, tmp_p, tmp_t = after_customers.popleft()
                bank_line.append((tmp_p, tmp_t))

        if curr_customer_t > T:  # 고객이 다시 뒤에 가서 서야 하면
            bank_line.append((curr_customer_p, curr_customer_t - T))  # 다시 맨 뒤에 서세요.



    elif curr_customer_t < T:  # 고객이 필요한 시간이 T시간보다 작으면
        i = 0
        while i < curr_customer_t and now < W:
            print(curr_customer_p)  # 고객이 필요한 시간만큼 그 고객 만나기
            now += 1
            i += 1

            # 이 시각 이전에 은행에 들어온 고객이 있으면 줄 서게 하기
            while after_customers and now == after_customers[0][0]:
                tmp_c, tmp_p, tmp_t = after_customers.popleft()
                bank_line.append((tmp_p, tmp_t))
728x90