[java] 프로그래머스 - 다리를 지나는 트럭
업데이트:
문제
주어진 순서로 모든 트럭이 다리를 건너는데 걸리는 시간(초)를 알아내는 문제.
- 예시
경과시간 | 다리를 지난 트럭 | 다리를 건너는 트럭 | 대기트럭 |
---|---|---|---|
0 | [] | [] | [7,4,5,6] |
1~2 | [] | [7] | [4,5,6] |
3 | [7] | [4] | [5,6] |
4 | [7] | [4,5] | [6] |
5 | [7,4] | [5] | [6] |
6~7 | [7,4,5] | [6] | [] |
8 | [7,4,5,6] | [] | [] |
풀이
- truck(list) : 트럭 무게가 담는 리스트
- times(list) : 트럭의 다리 진입 시간을 담는 리스트
- time(int) : 현재 시간
- total(int) : 다리위 트럭의 무게 총합
- idx(int) : 대기 트럭이 다리를 건널 때 몇번째 트럭이 건너는지에 대한 정보를 담고있는 변수
- total과
대기트럭의 idx번째 트럭무게(다리를 건너고싶은 트럭의 무게)
의 합이 초과무게를 넘지않으면
truck에 건너고 싶은 트럭의 무게를 추가한다
times에 현재 시간+1초를 넣는다 (진입시간 1초 포함)
total에 현재 트럭의 무게를 추가한다
2.times의 첫번째(다리 위 첫번째 트럭의 진입시간)
과 다리 길이
를 더한 값이 time라면
현재 다리 위의 첫번째 트럭이 다리를 빠져나가는 경우이므로
total에서 대상 트럭의 무게를 빼준다
times에서도 제외
-
2가 아닌경우 (다리위 첫번째 트럭이 다리를 건너는데 추가 시간이 필요한 경우)
time(현재 시간)은 대상 트럭의 진입시간 + 다리길이로 지정
total에서 대상 트럭 무게를 제외해준다
만일, idx번째 트럭이 (1)단계를 수행할 수 있으면 (1)단계 수행 -
idx가 대기 트럭을 다 순환한 경우, 가장 마지막에 진입한 트럭의 진입시간 + 다리길이를 리턴한다.
소스코드
import java.util.LinkedList;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int time = 0;
if (bridge_length == 1)
return truck_weights.length + 1;
LinkedList<Integer> truck = new LinkedList<>();
LinkedList<Integer> times = new LinkedList<>();
int idx = 0;
int total = 0;
while (idx < truck_weights.length) {
if (total + truck_weights[idx] <= weight) { // 초과무게를 넘지않으면
truck.add(truck_weights[idx]);
times.add(++time);
total += truck_weights[idx++];
if (times.peekFirst() + bridge_length == time) {
total -= truck.pollFirst();
times.pollFirst();
}
} else {
int target = truck.pollFirst();
total -= target;
time = times.pollFirst() + bridge_length;
if (idx < truck_weights.length && total + truck_weights[idx] <= weight) {
truck.add(truck_weights[idx]);
times.add(time);
total += truck_weights[idx++];
}
}
}
time = times.pollLast() + bridge_length;
return time;
}
}
댓글남기기