Queue의 개념을 알고있어야 풀이가 가능한 문제이다.

 

풀이 과정 

  1. 다리가 비어있을때 큐에 트럭을 담아주고 트럭의 무게값을 변수에 합산해준다.
  2. 다리가 꽉차 있을경우 poll()을 사용하여 맨앞 트럭을 빼주고 무게값에서 빠진 트럭의 무게만큼 빼준다.(poll()을 사용하게 될경우 큐의 앞의 제거하고 반환해주게된다.)
  3. 두 가지 경우를 모두 벗어나고, 무게가 초과하는 경우 큐에 0을 담아주어 트럭을 한칸 밀어준다.
  4. 두 가지 경우를 모두 벗어나고, 무게가 초과하지 않는 경우 다리가 비었을때와 동일하게 큐에 트럭을 담아주고 무게값을 합산해준다.

풀이 코드

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

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int sum_weight = 0;

        Queue<Integer> truck = new LinkedList<>();

        for (int i : truck_weights) {
            while (true) {
                //다리위가 비어있는 경우
                if (truck.isEmpty()) {
                    truck.add(i);
                    sum_weight += i;
                    answer++;
                    break;
                //다리가 꽉차있는경우
                } else if (truck.size() == bridge_length) {
                    sum_weight -= truck.poll();
                } else {
                    //다리가 비어있지도,꽉차지도 않고 견디는 무게보다 큰경우
                    if (i + sum_weight > weight) {
                        truck.add(0);
                        answer++;
                    } else {
                        truck.add(i);
                        sum_weight += i;
                        answer++;
                        break;
                    }
                }
            }
        }
        //다리위에 있는 모든 트럭이 지나가야되기 때문에 다리길이 더해주기
        return answer + bridge_length;
    }
}