PROGRAMMERS_Lv2_다리를 지나는 트럭
📁 [Lv2_42583] 다리를 지나는 트럭
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Integer> q = new LinkedList<Integer>();
int time = 0;
int sum = 0;
for(int i=0; i<truck_weights.length; i++){
int truck_weight = truck_weights[i];
while(true){
// queue에 아무것도 없는 경우
if(q.isEmpty()){
// queue에 추가, 무게 추가, 시간 추가
q.add(truck_weight);
time++;
sum += truck_weight;
break;
}
// 큐에 다리 길이만큼 트럭이 다 찬 경우
else if(q.size() == bridge_length){
sum -= q.poll();
}
// queue에 트럭이 있는 경우
else{
// 무게가 넘는 경우
if(weight < sum + truck_weight){
q.add(0);
time++;
}
// 무게가 안 넘는 경우
else{
q.add(truck_weight);
time++;
sum += truck_weight;
break;
}
}
}
}
// 마지막 트럭이 나올 때 까지
return time + bridge_length;
}
}
🤔 나의 생각
Queue의 FIFO 성질을 사용해 문제를 해결했다.
먼저 경우들을 나누어 주었다.
- 큐가 빈 경우
- 큐 다리 길이만큼 트럭이 다 찬경우
- 큐가 비지 않은 경우
- 큐에 트럭이 있는 경우
- 무게를 넘는 경우
- 무게가 안 넘는 경우
- 큐에 트럭이 있는 경우
큐에 트럭이 추가 되는 경우 시간, 무게를 추가하고 while문을 벗어나게 해주었다.
그리고 큐의 크기만큼 트럭이 찬 경우는 트럭이 나갈 시간이 다 되었단 의미이다.
마지막 트럭까지 다 나오는 경우를 계산해서 time + bridge_length 를 해주었다.