개발조아

[BOJ/백준] 22234 가희와 은행 파이썬 본문

알고리즘/백준

[BOJ/백준] 22234 가희와 은행 파이썬

개발조아 2021. 8. 24. 15:57
728x90

문제 링크 : https://www.acmicpc.net/problem/22234

 

22234번: 가희와 은행

가희는 창구가 하나인 은행을 운영하고 있습니다. 가희의 은행이 영업을 시작했을 때, 대기 줄에는 손님이 N명 있습니다. [그림 1] 카운터 직원과 N명의 손님 x번 손님에 대한 정보는 x번 손님의

www.acmicpc.net

 

은행에서 업무를 라운드 로빈 방식으로 처리한다.

 

OS 스케쥴링 정책 중 라운드 로빈 스케쥴링이다.

간단히 설명하면 프로세스들 사이에 우선순위를 두지 않고 들어온 순서대로 처리하지만 공평하게 CPU를 사용하기 위해 시간단위(Time Quantum) 만큼만 CPU를 할당받아 수행한다. 이후 작업이 남아있다면 다시 대기열의 맨 뒤로 가서 대기한다.

 

문제의 알고리즘도 이 방식으로 진행된다. 문제의 시간단위는 t가 된다.

 

0초 이후 들어온 손님들을 리스트에 담아 들어온 시간으로 정렬했다.

이후 w 시간까지 돌면서 들어온 시간이 되면 대기 큐에 넣어줬다.

 

문제가 출력이 굉장히 많기 때문에 print 대신에 sys.stdout.write를 사용했다.

write는 개행문자가 안들어가므로 넣어줘야한다.

 

from sys import stdin,stdout
from collections import deque

input = stdin.readline
print = stdout.write
n,t,w = map(int, input().split())
wait_q = deque()

for _ in range(n):
    sp,st = map(int, input().split())
    wait_q.appendleft((sp,st,0))

m = int(input())
nxt_cust = []

for _ in range(m):
    sp,st,sc = map(int, input().split())
    nxt_cust.append((sp,st,sc))

nxt_cust.sort(key=lambda x:(-x[2]))
def solv():
    global wait_q,nxt_cust

    np,ns,nc = wait_q.pop()
    tmp = t
    for now in range(1,w+1):
        if nxt_cust and nxt_cust[-1][2] == now:
            wait_q.appendleft(nxt_cust.pop())

        print('%d\n'%np)
        tmp -= 1
        ns -= 1
        if tmp == 0 or ns == 0:
            if ns > 0:
                wait_q.appendleft((np, ns, nc))
            tmp = t
            if wait_q:
                np,ns,nc = wait_q.pop()
solv()
Comments