[java] 프로그래머스 - 다리를 지나는 트럭

1 분 소요

업데이트:

문제

프로그래머스-다리를 지나는 트럭

주어진 순서로 모든 트럭이 다리를 건너는데 걸리는 시간(초)를 알아내는 문제.

  • 예시
경과시간 다리를 지난 트럭 다리를 건너는 트럭 대기트럭
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) : 대기 트럭이 다리를 건널 때 몇번째 트럭이 건너는지에 대한 정보를 담고있는 변수
  1. total대기트럭의 idx번째 트럭무게(다리를 건너고싶은 트럭의 무게)의 합이 초과무게를 넘지않으면
    truck에 건너고 싶은 트럭의 무게를 추가한다
    times에 현재 시간+1초를 넣는다 (진입시간 1초 포함)
    total에 현재 트럭의 무게를 추가한다

2.times의 첫번째(다리 위 첫번째 트럭의 진입시간)다리 길이를 더한 값이 time라면
현재 다리 위의 첫번째 트럭이 다리를 빠져나가는 경우이므로
total에서 대상 트럭의 무게를 빼준다
times에서도 제외

  1. 2가 아닌경우 (다리위 첫번째 트럭이 다리를 건너는데 추가 시간이 필요한 경우)
    time(현재 시간)은 대상 트럭의 진입시간 + 다리길이로 지정
    total에서 대상 트럭 무게를 제외해준다
    만일, idx번째 트럭이 (1)단계를 수행할 수 있으면 (1)단계 수행

  2. 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;
	}
}

댓글남기기