일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 프로그래머스 #NULL 처리하기
- 동
- 카카오 코테
- 프로그래머스 #python #코딩테스트 #코테공부 #알고리즘 #dict
- 백준 #이거다시풀기
- 카카오 #프로그래머스 #python #코딩테스트 #오픈채팅방
- 프로그래머스 #네트워크 #c++ #코딩테스트 #코테 #코테준비 #dfs
- 프로그래머스 #sql #mysql #코딩테스트
- 백준 #백준알고리즘 #알고리즘 #코딩테스트 #코딩테스트준비 #코테준비 #백준2110 #python #문제풀이
- 그리디알고리즘 #그리디 #백준 #우선순위큐 #최소힙 #최대힙 #알고리즘 #코딩테스트 #python
- 프로그래머스 #python #2021카카오 #카카오코테 #카카오인턴쉽
- 프로그래머스 #c++ #코딩테스트
- 백준 #백준2217 #백준로프 #python
- Today
- Total
say repository
[1826] 연료 채우기 python 백준 본문
문제
성경이는 트럭을 정글 속에서 운전하다가 트럭의 연료탱크에 갑자기 구멍이 나서 1km를 가는데 1L의 연료가 새 나가게 되었다. 이것을 고치기 위해서는 가장 가까운 마을에 가야 한다. 그런데 그냥 가다가는 중간에 연료가 다 빠질 수가 있다. 다행스럽게도 정글 곳곳에 연료를 채울 수 있는 주유소가 N개 있다. 그런데 정글 속에서 중간에 차를 멈추는 행위는 매우 위험한 행위이므로 주유소에서 멈추는 횟수를 최소화 하려 한다.
그리고 다행이도 성경이의 트럭은 매우 좋아서 연료 탱크에는 연료의 제한이 없이 많이 충분히 많이 넣을 수 있다고 한다. 각각의 주유소의 위치와, 각 주유소에서 얻을 수 있는 연료의 양이 주어져 있을 때, 주유소에서 멈추는 횟수를 구하는 프로그램을 작성하시오.
정글은 일직선이고, 성경이의 트럭과 주유소도 모두 일직선 위에 있다. 주유소는 모두 성경이의 트럭을 기준으로 오른쪽에 있다.
입력
첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있는데 a(1 ≤ a ≤ 1,000,000)는 성경이의 시작 위치에서 주유소 까지의 거리, 그리고 b(1 ≤ b ≤ 100)는 그 주유소에서 채울 수 있는 연료의 양을 의미한다. 그리고 N+2번째 줄에는 두 정수 L과 P가 주어지는데 L(1 ≤ L ≤ 1,000,000)은 성경이의 위치에서 마을까지의 거리, (1 ≤ P ≤ 1,000,000)는 트럭에 원래 있던 연료의 양을 의미한다.
출력
첫째 줄에 주유소에서 멈추는 횟수를 출력한다. 만약 마을에 도착하지 못할경우 -1을 출력한다.
코드
import sys
import heapq
n = int(sys.stdin.readline())
q = []
for _ in range(n):
heapq.heappush(q,list(map(int,sys.stdin.readline().split())))
# 최소힙에 삽입
target, fuel = map(int,sys.stdin.readline().split())
move = [] #움직인 큐 최대힙
cnt = 0
while fuel<target:
while q and q[0][0]<=fuel:
mf, pf = heapq.heappop(q)
heapq.heappush(move,[-pf,mf])
if not move:
cnt = -1
break
pf1, mf1 = heapq.heappop(move)
fuel += -pf1
cnt += 1
print(cnt)
풀이
그리디 알고리즘, 우선순위 큐
1km를 가는데 1L의 연료가 새 나가게 되니까 처음의 연료양으로 최종 마을까지 가야 한다.
- 입력받은 주유소 n개의 ( 주유소 거리, 연료 양 )을 최소 힙에 저장한다.
- 처음의 연료 양을 시작으로 최종 마을까지 최소의 주유소를 거쳐 가야 한다.
- 가는 길에 주유소가 있어야 하고 갈 수 있는 주유소에서 최대의 연료 양을 뽑아야 한다.
- 이때, 우선순위 큐를 생각하여 최대 힙으로 바꿔야 한다.
- 그중에서도 연료 양이 기준이 되기에 (연료 양, 주유소 거리) 순서를 바꿔주고 ( - 연료양, 주유소거리 )로 연료 양에 -를 붙여서 최대 힙을 만든다.
출처 : 백준
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 12865 평범한 배낭 python (0) | 2022.03.13 |
---|---|
[백준] 1202 보석 도둑 python (0) | 2022.03.12 |
[백준] 2527 직사각형 python (0) | 2022.03.11 |
[백준] 7562 나이트의 이동 python (0) | 2022.03.11 |
[백준] 7569 토마토 python (0) | 2022.03.09 |