다리를지나는트럭 (level2)

다리를지나는트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다.

트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.

※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다.

이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.


풀이

  1. 트럭의 위치를 저장하는 배열 truck_status를 생성한다.
  2. 시간에 따라 while을 반복
    1. 마지막 트럭이 출발하면 break
    2. 현재 index의 트럭 앞 트럭 중 도착을 안했다면 truck_status를 더해준다.
      • 트럭이 도착하면 (truck_status == bridge_length+1) 현재 무게에서 트럭의 무게를 빼준다.
    3. 만약 index의 트럭 무게가 다리 무게를 초과하지 않으면 현재 무게와 상태를 변경한 후 index를 넘긴다
  3. 다리 길이만큼 시간을 더한다.

코드

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
       int time = 0;
		int[] truck_status = new int[truck_weights.length];
		int current_weight = 0;
		int index = 0;
		
		while(true) {
			if(truck_status[truck_status.length-1] == 1) {
				break;
			}
			
			
			for(int i = 0; i < index; i++) {
				if(truck_status[i] == bridge_length+1)continue;
				
				truck_status[i]++;
				if(truck_status[i] == bridge_length+1) {
					current_weight -= truck_weights[i];
				}
				
			}
			
			if(current_weight + truck_weights[index] <= weight) {
				current_weight += truck_weights[index];
				truck_status[index]++;
				index++;					
			}
			time++;
			
		}
		time+=bridge_length;
        return time;
    }
}