SWEA 9280. 진용이네 주차타워 (Python, 구현, D3)

전승재·2023년 10월 4일
0

알고리즘

목록 보기
55/88

문제 접근

들어오고 나가는 것을 잘 체크해주면 되는 문제이다.
두가지 경우로 나눠서 볼 수 있겠는데, 주차장에 자리가 있을 경우와 없을 경우를 생각하면 된다.
자리가 있을 경우에는 가장 작은 주차번호에 그대로 넣어주면 되고, 만약 자리가 없다면 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()))

구현

  1. 들어오는 차가 입력일 경우
    이 경우에는 빈자리가 있을 경우와 없을 경우로 나누어 생각할 수 있다.
    빈자리가 있을 경우에는 가장 작은 번호의 주차장 자리에 이 들어오는 차를 넣어주면 된다. 차를 넣고 넣은 자리의 가격과 그 차의 무게를 곱한 값을 진용이가 받는다.
    만약 빈자리가 없다면 waiting 큐에 넣어준다.

  2. 나가는 차가 입력일 경우
    이 경우에는 나가는 차의 주차장 인덱스를 찾고 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}')

0개의 댓글