연료통 크기에 제한이 있는 경우는 앞의 전략은 안통한다. '이전 주유소에서 연료를 샀던것'으로 처리할때, 그 시점에서 연료통이 얼마나 비어있었는지를 관리하기가 까다롭기 때문이다.
대신 반대 방법으로 접근할수 있다. 모든 주유소에서 연료통을 가득 채울 수 있도록 주유를 하는 것으로 처리하는 것이다. 만약 어떤 주유소에 도착했을때, 연료통에 들어있는 남은 연료중에 지금 주유소 가격보다 비싸게 구입했던 것이 있다면, 그것을 '사실 아까 연료를 안샀던 것'으로 처리하고 지금 주유소에서 그만큼을 다시 사면 된다.
이렇게 비싼 연료를 나중에 취소할수 있다면, 이동할때에는 가장 싼 연료부터 사용해야 한다. 연료통에 들어있는 연료들을 (가격, 양)들로 구분해서 저장해두고 여기에서 가장 싼 연료(이동할때)와 가장 비싼연료(취소할때) 를 찾을 수 있어야 한다.
주유소에서 파는 연료의 양에 제한이 없다면, 주유소를 들를때마다 현재 가격보다 비싸게 샀던 연료들은 다 취소하고 현재 주유소의 연료로 채우게 될것이므로, 연료통의 연료들을 모노톤하게 유지할수 있다. 덱에다가 구현하면 총 시간복잡도는 O(n)이 된다.
주유소에서 파는 연료의 양에 제한이 있다면, 현재 주유소보다 비싼 연료들을 다 취소할수는 없으므로 데이터를 모노토닉하게 유지하는 것은 힘들다. 그래서 그냥 최솟값과 최댓값을 빠르게 추출하기 위해서는 double-ended PQ나 BST를 써서 O(logn)에 처리해줘야 한다. 총 시간복잡도는 O(nlogn)이 된다
간단하게 말하면, '어떤 주유소에서 산 연료는, 나중에 언제 어디서든지 샀을때의 가격 그대로 되팔수 있다.' 라는 조건을 문제에 추가해서 생각하는 것이다. 이래도 답은 바뀌지 않는다
관련 문제
16399: 주유소마다 파는 양의 제한은 없다
16399: 주유소마다 파는 양의 제한은 없다