들어오고 나가는 것을 잘 체크해주면 되는 문제이다.
두가지 경우로 나눠서 볼 수 있겠는데, 주차장에 자리가 있을 경우와 없을 경우를 생각하면 된다.
자리가 있을 경우에는 가장 작은 주차번호에 그대로 넣어주면 되고, 만약 자리가 없다면 waiting list 큐에 넣어두어서 자리가 날 경우에 채워주면 된다.
입력이 되게 많아서 복잡하게 느낄 수 있지만 하나씩 입력을 처리해주다보면 정리가 된다.
입력을 아래와 같이 리스트에 넣어준다. R은 주차장의 무게 단위당 가격이다.
W는 m개의 차량의 무게를 담고 있다.
result는 진용이가 받을 총 price이다.
parking은 현재 주차장의 자리가 비어있는지 확인하는 리스트이다.
n, m = map(int, input().split())
R = []
W = []
waiting = deque([])
result = 0
parking = [0 for i in range(n)]
for i in range(n):
R.append(int(input()))
for i in range(m):
W.append(int(input()))
들어오는 차가 입력일 경우
이 경우에는 빈자리가 있을 경우와 없을 경우로 나누어 생각할 수 있다.
빈자리가 있을 경우에는 가장 작은 번호의 주차장 자리에 이 들어오는 차를 넣어주면 된다. 차를 넣고 넣은 자리의 가격과 그 차의 무게를 곱한 값을 진용이가 받는다.
만약 빈자리가 없다면 waiting 큐에 넣어준다.
나가는 차가 입력일 경우
이 경우에는 나가는 차의 주차장 인덱스를 찾고 parking에 자리가 비었다고 표시해준다.
만약 이 때 waiting하고 있는 차가 있다면 그 차들 중 가장 첫번째로 기다리고 있는 차를 그 자리에 넣어준다. 그리고 진용이가 돈을 받는다.
사실 이게 가능한 이유는 waiting은 모든 자리가 차있을 경우에만 생긴다. 따라서 waiting이 존재한다는 것은 모든 주차장에 차가 존재하는 것을 의미한다.
그렇기 때문에 주차장에서 차 1개가 빠져나온다면 waiting에 존재하는 차들 중 하나가 들어갈 수 있는 것을 의미해 넣어줄 수 있는 것이다.
for i in range(2*m):
x = int(input())
if x > 0: # 들어오는 차라면
for j in range(n):
if parking[j] == 0: # 빈자리가 있다면
parking[j] = x # 빈자리에 주차
result += R[j]*W[x-1] # 돈 받기
break
else: # 빈자리가 없다면 waiting하기
waiting.append(x)
else: # 나가는 차라면
x = abs(x)
for j in range(n):
if parking[j] == x: # 차 뺴요~
# 차빠지는데 기다리는 사람이 있다면
if len(waiting)>0:
x = waiting.popleft()
parking[j] = x
result += R[j]*W[x-1]
break
else:
parking[j] = 0
break
from collections import deque
T = int(input())
for test_case in range(1, T + 1):
n, m = map(int, input().split())
R = []
W = []
waiting = deque([])
result = 0
parking = [0 for i in range(n)]
for i in range(n):
R.append(int(input()))
for i in range(m):
W.append(int(input()))
for i in range(2*m):
x = int(input())
if x > 0: # 들어오는 차라면
for j in range(n):
if parking[j] == 0: # 빈자리가 있다면
parking[j] = x # 빈자리에 주차
result += R[j]*W[x-1] # 돈 받기
break
else: # 빈자리가 없다면 waiting하기
waiting.append(x)
else: # 나가는 차라면
x = abs(x)
for j in range(n):
if parking[j] == x: # 차 뺴요~
# 차빠지는데 기다리는 사람이 있다면
if len(waiting)>0:
x = waiting.popleft()
parking[j] = x
result += R[j]*W[x-1]
break
else:
parking[j] = 0
break
print(f'#{test_case} {result}')