
문제를 이해하는데 너무 오랜 시간이 걸렸고, 다리를 건너는 시간에 대해 이해를 못하고 있던 중에 다른 사람의 풀이를 보고 이해할 수 있었다. 참고
다리 위에서 한 칸씩 움직일 때마다 1초가 흐른다. 만약 다리의 길이가 2라면 한 트럭이 지나갈 때까진 2초의 시간이 흐르게 된다. 다리에 올라갈 수 있는 트럭의 무게는 제한이 있고, 무게 제한을 넘지 않는 선에서 트럭을 움직인다.
생각해야 할 조건들이 되게 많은데 나열해보자면 아래와 같다.
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> bridge = new LinkedList<>();
int sum = 0;
int time = 0;
for (int i = 0; i < truck_weights.length; i++) {
int truck = truck_weights[i];
while (true) {
if (bridge.isEmpty()) { // 다리가 비었다면 트럭 추가!
bridge.add(truck);
sum += truck;
time++;
break;
} else if (bridge.size() == bridge_length) { // 다리에 트럭이 전부 찬 경우
sum -= bridge.poll(); // 다리를 다 건넜다는 뜻이므로 빼준다
} else { // 다리에 자리가 남았을 때
if (sum + truck <= weight) { // 다음 트럭이 올라갈 수 있는지 무게 체크
bridge.add(truck);
sum += truck;
time++;
break;
} else { // 못 올라간다면 '0' 을 다리에 올려서 앞에 트럭 한 칸 이동
bridge.add(0);
time++;
}
}
}
}
int result = time + bridge_length; // 마지막 트럭은 칸 이동을 하기 전에 끝나므로 다리의 길이만큼 더함
return result;
}
}
while 문 내부에서 조건문으로 실행되므로 O(N)
문제 이해력, 아이디어 부재, 너무 어렵게 생각한 이유들로 접근하기 어려웠던 거 같음
문제를 읽은 후 이해가 되지 않는다면 빠르게 다른 사람의 풀이를 통해 접근법을 다양하게 생각할 수 있도록 해보자.