1. 문제 풀이 아이디어
- 각 트럭의 현재 위치를 배열로 저장하고, 마지막 트럭이 다리를 모두 건널 때까지 반복하여 문제를 해결한다.
2. 나의 정답 코드
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
int count = 0;
int[] truck_move = new int[truck_weights.length];
int bridge_weight = 0;
while (truck_move[truck_weights.length - 1] <= bridge_length) {
for (int i = 0; i < truck_weights.length; i++) {
if (truck_move[i] == 0 || truck_move[i] > bridge_length) continue;
truck_move[i]++;
if (truck_move[i] > bridge_length) {
bridge_weight -= truck_weights[i];
}
}
if (count < truck_weights.length && bridge_weight + truck_weights[count] <= weight) {
truck_move[count]++;
bridge_weight += truck_weights[count];
count++;
}
answer++;
}
return answer;
}
}
3. 정리
- 트럭의 위치를
truck_move
배열에 저장하고, 다리에 올릴 다음 트럭의 인덱스를count
로 관리한다.
while
문은 마지막 트럭의 위치가 다리 길이를 초과할 때까지 반복한다.
truck_move
배열을 순회하며, 위치가 0인 경우는 출발하지 않은 트럭이고, 위치가 다리 길이보다 큰 경우는 이미 다리를 건넌 트럭이므로 처리하지 않는다.
- 나머지 트럭의 위치는 한 칸씩 증가시킨다.
- 트럭의 위치가 다리 길이를 초과하면 해당 트럭의 무게를 다리의 총 무게에서 차감한다.
- 이동할 트럭이 남아있고, 현재 다리의 총 무게에 해당 트럭의 무게를 더했을 때 제한 무게를 초과하지 않으면, 해당 트럭을 다리에 올려 이동 거리를 증가시키고 다리 무게를 갱신하며
count
를 증가시킨다.
while
문이 한 번 실행될 때마다answer
값을 증가시켜, 모든 트럭이 다리를 건넌 시점의 시간을 반환한다.
Share article