[ BOJ / Python ] 1826번 연료 채우기

황승환·2022년 1월 9일
0

Python

목록 보기
82/498

이번 문제는 현재 가지고 있는 연료의 양으로 갈 수 있는 주유소 중에서 가장 많은 연료를 채울 수 있는 주유소에 방문하는 것을 기본으로 하여 해결하였다. 주유수의 정보를 모두 입력 받은 뒤에 이를 내림차순으로 정렬한 후 목적지에 갈 수 있는 기름이 모일 때까지 현재 기름으로 갈 수 있는 주유소에 대한 정보를 최대힙에 저장하여 가장 연료 충전량이 많은 것을 취하는 방식으로 구현하였다.

  • heapq를 불러온다.
  • n을 입력받는다.
  • 주유소의 정보를 배열 stations에 입력받는다.
  • 목적지의 위치에 해당하는 변수 goal과 초기에 가지고 있는 연료의 양을 저장하는 변수 cur_gas를 입력받는다.
  • stations를 내림차순으로 정렬한다.
  • 현재 기름으로 갈 수 있는 주유소의 충전량을 저장하는 배열 tmp를 선언한다.
  • 주유소에 들리는 횟수를 나타내는 cnt를 0으로 정의한다.
  • cur_gas가 goal보다 작을 동안 반복하는 while문을 돌린다.
    -> stations의 원소가 존재하고 stations[-1][0]이 cur_gas보다 작거나 같을 동안 반복하는 while문을 돌린다.
    --> 주유소의 위치에 해당하는 임시 변수 distance와 연료 충전량에 해당하는 임시 변수 gas를 선언하고 stations를 pop()하여 각각에 저장해준다.
    --> tmp에 heapq의 heappush를 이용하여 -gas를 넣어준다. -를 붙인 이유는 heapq.heappush()는 입력 시 오름차순으로 자동 정렬이 되기 때문에 -를 붙여 반대 순서, 즉 최대힙을 구현하기 위함이다.
    -> 만약 tmp가 비어있다면 while문을 탈출한다.
    -> cur_gas에 tmp를 heappop()하여 빼준다. -gas로 저장되어 있기 때문에 이는 곧 더하는 과정이 된다.
    -> cnt를 1 증가시킨다.
  • 만약 goal이 cur_gas보다 작거나 같다면 cnt를 출력한다.
  • 만약 goal이 cur_gas보다 크다면 -1을 출력한다.

Code

import heapq
n=int(input())
stations=[list(map(int, input().split())) for i in range(n)]
goal, cur_gas=map(int, input().split())
stations.sort(reverse=True)
tmp=[]
cnt=0
while cur_gas<goal:
    while stations and stations[-1][0]<=cur_gas:
        distance, gas=stations.pop()
        heapq.heappush(tmp, -gas)
    if not tmp:
        break
    cur_gas-=heapq.heappop(tmp)
    cnt+=1
if goal<=cur_gas:
    print(cnt)
else:
    print(-1)

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글