티스토리 뷰

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


 

1. 접근 방식

  • 주차장에 빈 공간이 있으면, 가장 번호가 공간에 주차시킨다.

즉, 현재 주차 공간의 현황을 알려주는 리스트가 필요하다고 판단하였다. 비어 있으면 0, 주차되어 있다면 0이 아닌 다른 값이 저장된 리스트. 리스트의 index(x) 메서드는 리스트 내에 x 값을 원소가 여러 개라도 첫 번째로 발견된 x의 인덱스를 반환하기 때문에 가장 작은 번호 공간에 주차시키는 건 어렵지 않게 처리할 수 있다.

 

  • 주차 공간이 없다면 대기한다.

이를 위한 waiting 리스트가 필요하다. FIFO 방식이므로, 빈 공간이 발생하면 pop(0)을 하여 가장 첫 번째 원소를 꺼내 주차시키도록 코드를 작성하였다.

 

 

2. 정답 코드

T = int(input())

for test_case in range(1, T + 1):
    n, m = map(int, input().split())
    r = [ int(input()) for _ in range(n) ]
    w = [ int(input()) for _ in range(m) ]
    data = [ int(input()) for _ in range(m*2) ]
    
    parked = [0] * n # 0 means empty
    waiting = []
    result = 0

    for i in data:
        if i < 0:
            index = parked.index(abs(i))
            if waiting:
                j = waiting.pop(0)
                parked[index] = j
                result += r[index] * w[j-1]
            else:
                parked[index] = 0

        else:
            if 0 not in parked:
                waiting.append(i)
            else:
                index = parked.index(0)
                parked[index] = i
                result += r[index] * w[i-1]

    print(f'#{test_case} {result}')

처음에 문제를 이해하는 데 시간이 오래 걸렸지만, 재밌는 문제였다. 파이썬이 not in 연산을 지원한 덕분에 수월하게 문제의 로직을 구현할 수 있었다.

728x90