해당 문제를 풀기 위해서는 현재 연료 수 P
와 주유소에서 충전할수 있는 연료의 수 b
의 합이 성경이 출발 지점에서 이동할수 있는 거리
임을 찾아내야한다.
그 다음 P를 가지고 이동할수 있는 주유소 중 가장 많은 양의 연료를 충전할수 있는 주유소를 방문해야한다.
그러기 위해서는 거리순으로 정렬되어있는 주유소의 PriorityQueue< Soil > stations 와 P로 이동가능한 주유소 중 연료를 기준으로 내림차순되어있는 PriorityQueue< Integer > pq를 사용해야한다.
테스트케이스를 예시로 들어보자면 stations에 거리를 기준으로 내림차순 정렬을 한다.
만약 L이 30이라면 pq에 남아있는 연료 2를 추가하여 이동하면 목적지까지 도달할수 있게 된다.
이 때 주유소의 개수는 4개가 된다.
public class 연료채우기 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
//거리 기준 내림차순 정렬
PriorityQueue<Soil> stations = new PriorityQueue<>();
for(int i=0;i<N;i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
stations.offer(new Soil(a,b));
}
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int L = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
int answer = 0;
//이동가능한 주유소 중 연료 기준 내림차순
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
//연료P가 L보다 크거나 같을때까지 반복
while(P<L){
//이동할 주유소가 있고 그 주유소가 현재 연료로 이동가능하다면 pq에 추가해준다.
while(!stations.isEmpty()&&stations.peek().pos<=P){
pq.offer(stations.poll().fuel);
}
//P를 가지고 목적지에 도착하지 못했는데 이동가능한 주유소가 없다면 -1 반환.
if(pq.isEmpty()){
answer = -1;
break;
}
//이동가능한 주유소가 있다면 그 중 충전할 수 있는 연료가 가장 많은 것을 P에 추가
P += pq.poll();
answer++;
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
static class Soil implements Comparable<Soil>{
int pos;
int fuel;
public Soil(int pos, int fuel){
this.pos = pos;
this.fuel = fuel;
}
@Override
public int compareTo(Soil o1){
return this.pos - o1.pos;
}
}
}
남은 연료 + 충전가능한 연료 = 이동가능한 거리
임을 알고나서 풀었을 때 주유소의 정보를 PQ가 아닌 배열에 저장하고 연료를 저장하는 PQ로 구현했었는데 메모리 초과가 떴다.
이유는 아직 모르겠다..