하중과 길이가 정해진 다리에 트럭 여러 대가 건너가려고 할 때, 걸리는 최소 시간을 구하는 문제이다.
다리 길이(bridge_length), 버틸 수 있는 하중(weight), 트럭의 수와 무게를 알 수 있는 배열(truck_weights)이 값으로 주어졌다.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
Queue<Integer> bridge = new LinkedList<>();
// 비어있는 다리의 공간을 0으로 가득 채웠다.
for(int i=0;i<bridge_length;i++){
bridge.offer(0);
}
int index = 0;
// 다리에 있는 현재 트럭의 무게이다.
int currentWeight = 0;
// 트럭이 더이상 남아있지 않을 때 탈출해주기 위해 조건을 만들었다.
while(index < truck_weights.length){
// 현재 다리에 있는 트럭무게에서 곧 나갈 트럭의 무게를 빼준다.
currentWeight -= bridge.poll();
// 새 트럭이 들어올 것이므로 1초를 추가한다.
answer++;
// 현재 다리에 있는 트럭 무게와 곧 들어올 트럭 무게의 합과 다리의 하중을 비교
if(currentWeight + truck_weights[index] <= weight){
// 무게를 버틴다면 다리에 트럭을 추가한다.
bridge.offer(truck_weights[index]);
// 현재 다리에 있는 트럭 무게에도 새 트럭 무게를 더해준다.
// 그리고 다음 트럭을 지정하기 위해 후위 연산자를 써주어 index를 증가시켰다.
currentWeight += truck_weights[index++];
} else{
// 버티지 못한다면 0을 추가한다.
bridge.offer(0);
}
}
//처음 설정한 0으로 채워진 다리가 전부 치환되면 결국 처음 다리 길이와 같으므로
//트럭이 지나간 시간 + 다리 길이
return answer + bridge_length;
}
}
최종 코드이다. java를 이제 막 공부하고 있는 입장이라 queue를 처음 써보지만 문제 유형이 스택/큐로 분류되어 있어 queue를 이용하여 풀어봤다.
while(index < truck_weights.length){
answer++;
currentWeight -= bridge.poll();
if(currentWeight + truck_weights[index] <= weight){
bridge.offer(truck_weights[index]);
currentWeight += truck_weights[index++];
} else{
bridge.offer(0);
}
}
이 로직을 짤 때 생각을 많이 했는데, 결국 문제 그대로 다리에서 트럭을 넣고 빼는 것이 가장 직관적이고 구현이 쉬워 이렇게 구현했다.