https://school.programmers.co.kr/learn/courses/30/lessons/42583
Queue를 사용해야겠다는 생각은 들었는데 정확히 어떤 부분을 사용해야할지 감이 안왔다. 풀이를 보고 Queue에 0을 삽입하는게 굉장히 독특한 아이디어였다.
- 다리를 Queue라고 놓고 최대 올라갈 수 있는 bridge_length만큼 0을 채워준다.
ex) 0 0
- 다리의 총 무게가 얼마인지 더하는 bridgeW 변수를 설정하고, time++전 마다 bridgeW에서 queue에서 poll한 값을 빼준다.
bridgeW -= q.poll();
- 다음 값이 다리 위에 올라올 수 있는지 확인. ✨안된다면 Queue에 0을 삽입한다.
int nowTruckW = truck_weights[truckIndex]; if(bridgeW + nowTruckW <= weight){ bridgeW += nowTruckW; q.add(nowTruckW); truckIndex++; } else{ q.add(0); }
- 초기 조건식이 truckIndex < 배열 length 이기 때문에 그 이후에도 다리를 못빠져나온 트럭이 있으면 수행해준다.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> q = new LinkedList<>();
// 1. Queue를 bridge_length만큼 채워준다.
for(int i = 0; i < bridge_length; i++){
q.add(0);
}
// 2.
int truckIndex = 0;
int time = 0;
int bridgeW = 0;
while(truckIndex < truck_weights.length){
bridgeW -= q.poll();
int nowTruckW = truck_weights[truckIndex];
if(bridgeW + nowTruckW <= weight){
bridgeW += nowTruckW;
q.add(nowTruckW);
truckIndex++;
} else{
q.add(0);
}
time++;
}
while(bridgeW > 0){
bridgeW -= q.poll();
time++;
}
return time;
}
}