본문 바로가기
Problem Solving/백준

백준 1826 : 연료 채우기

by Libi 2021. 8. 26.
반응형

https://www.acmicpc.net/problem/1826

 

1826번: 연료 채우기

첫째 줄에 주유소의 개수 N(1 ≤ N ≤ 10,000)가 주어지고 두 번째 줄부터 N+1번째 줄 까지 주유소의 정보가 주어진다. 주유소의 정보는 두개의 정수 a,b로 이루어 져 있는데 a(1 ≤ a ≤ 1,000,000)는 성경

www.acmicpc.net

[ 문제풀이 ]

주유소를 사용하는 비용이 모두 동일하기 때문에 더 이상 이동할 수 없는 경우 현재 이동한 거리 내의 주유소 중 최대 연료의 양을 가지는 주유소를 선택하는 것이 최선의 선택이다.

따라서 주유소를 연료의 양을 기준으로 우선순위 큐에 저장해놓으면서 더 이상 이동할 수 없을 경우 이동할 수 있는 연료의 양을 만들어주면 된다.

연료를 만드는 도중 우선순위 큐가 비어서 이동할 수 없거나 모든 주유소를 사용했음에도 불구하고 도착지점을 갈 수 없다면 -1을 출력해주면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

public class Main {

	static class Station implements Comparable<Station> {
		int pos, fuel;

		Station (int pos, int fuel) {
			this.pos = pos;
			this.fuel = fuel;
		}

		@Override
		public int compareTo(Station o) {
			return this.pos - o.pos;
		}
	}
	
	public static void main(String[] args) {
		try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
				BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out))) {
			int N = Integer.parseInt(br.readLine());
			Station[] stations = new Station[N];
			for (int i = 0; i < N; ++i) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				int pos = Integer.parseInt(st.nextToken());
				int fuel = Integer.parseInt(st.nextToken());
				stations[i] = new Station(pos, fuel);
			}
			
			Arrays.sort(stations);
			
			StringTokenizer st = new StringTokenizer(br.readLine());
			int L = Integer.parseInt(st.nextToken());
			int P = Integer.parseInt(st.nextToken());

			PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1);
			int count = 0;
			for (int i = 0; i < N; ++i) {
				if (P >= L) break;
				if (stations[i].pos > P) {
					while (!pq.isEmpty() && stations[i].pos > P) {
						count++;
						P += pq.poll();
					}
					if (stations[i].pos > P) break;
				}
				pq.offer(stations[i].fuel);
			}
			
			while (!pq.isEmpty() && P < L) {
				count++;
				P += pq.poll();
			}
			bw.write((P >= L ? count : -1) + "\n");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

반응형

'Problem Solving > 백준' 카테고리의 다른 글

백준 5624 : 좋은 수  (0) 2021.08.29
백준 5214 : 환승  (0) 2021.08.27
백준 13308 : 주유소  (0) 2021.08.25
백준 15678 : 연세워터파크  (0) 2021.08.24
백준 9328 : 열쇠  (0) 2021.08.23

댓글