관리 메뉴

JumpUp

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

알고리즘

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

yeunnnn 2021. 7. 15. 17:09

문제설명

[다리를 지나는 트럭] 문제설명

 

코드

import org.junit.Assert;
import org.junit.Test;

import java.util.LinkedList;
import java.util.Queue;

public class 다리를지나는트럭 {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> truck = new LinkedList<>();
        int second = 0;
        int totalWeights = 0;

        for(int i=0;i<truck_weights.length;i++){
           //새로운 트럭이 진입못하는 경우, 진입할 수 있을 때까지 loop반복
           while(totalWeights+truck_weights[i] > weight || truck.size()+1 > bridge_length) {
               if(truck.size()==bridge_length){//다리가 꽉 차 있는 경우, 가장 먼저 진입한 트럭이 빠져나감
                   totalWeights -= truck.poll();
               }else{//다리에 진입해 있는 트럭만 지나갈 수 있도록, 0을 넣어준다.
                   truck.add(0);
                   second++;
               }
           }
           //새로운 트럭 진입할 수 있다
           truck.add(truck_weights[i]);
           totalWeights += truck_weights[i];
           second++;
        }

        return second+bridge_length;
    }

    @Test
    public void test(){
        Assert.assertEquals(8,solution(2,10,new int[]{7,4,5,6}));
    }
}

 

설명

새로운 트럭이 진입할 수 있을 때까지 2가지 행동을 반복해준다.

첫째, 다리위에 있는 트럭만 지나갈 수 있도록 큐에 0을 넣어주고 시간을 카운트해준다.

둘째, 큐 사이즈와 bridge_length이 같아진 경우(가장 먼저 진입한 트럭이 다리 끝에 있는 경우)

        가장 먼저 진입한 트럭을 큐와 totalWeight에서 빼준다.

 

새로운 트럭이 진입할 수 있을 땐, 큐와 totalWeights에 트럭의 무게를 더해주고 시간을 카운트해준다.

 

결국, 마지막 트럭이 다리에 진입한 순간 for loop에서 나오게 된다.

마지막 트럭이 다리에서 빠져나가기 위해 secound+bridge_length를 반환해주도록 한다.

     

 

      

728x90