알고리즘 문제 풀이/BOJ 골드
[백준] 1826 - 연료 채우기
natonato
2021. 7. 7. 09:47
1826번: 연료 채우기
첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있는데 a(1 ≤ a ≤ 1,000,000)는 성경
www.acmicpc.net
0. 최소 횟수로 목적지까지 도달하기 = 가능한 연료가 많은 주유소만 이용하기
1. 초기 이동가능 거리 X 안에 있는 주유소를 탐색
2. 우선순위 큐를 이용해 연료가 가장 많은 주유소를 선택, X를 X'로 갱신
3. X'로 거리가 늘어나며 추가로 갈 수 있게 된 주유소를 탐색
4. 1~3번 과정을 반복한다. X거리가 목표 거리를 초과하면 도달 성공
- 더이상 주유소가 없는데 목표 거리에 도달하지 못하면 도달 실패
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args)throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PriorityQueue<Integer>pq=new PriorityQueue<>(Collections.reverseOrder());
int N = pint(br.readLine());
int[][] oil = new int[N][2];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
oil[i][0] = pint(st.nextToken());
oil[i][1] = pint(st.nextToken());
}
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int dest = pint(st.nextToken());
int fuel = pint(st.nextToken());
int count=0;
int idx=0;
Arrays.sort(oil, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// TODO Auto-generated method stub
return o1[0]-o2[0];
}
});
while(fuel<dest) {
while(idx<oil.length && oil[idx][0]<=fuel) {
pq.offer(oil[idx++][1]);
}
if(pq.isEmpty()) {
count=-1; break;
}
else {
count++;
fuel+=pq.poll();
}
}
System.out.println(count);
}
static int pint(String s) {
return Integer.parseInt(s);
}
}