최대 1 분 소요

📁 [Lv2_42583] 다리를 지나는 트럭

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        Queue<Integer> q = new LinkedList<Integer>();
        
        int time = 0;
        int sum = 0;
        
        for(int i=0; i<truck_weights.length; i++){
            int truck_weight = truck_weights[i];
            
            while(true){
                // queue에 아무것도 없는 경우
                if(q.isEmpty()){
                    // queue에 추가, 무게 추가, 시간 추가
                    q.add(truck_weight);
                    time++;
                    sum += truck_weight;
                    break;
                }
                // 큐에 다리 길이만큼 트럭이 다 찬 경우
                else if(q.size() == bridge_length){
                    sum -= q.poll();
                }
                // queue에 트럭이 있는 경우
                else{
                    // 무게가 넘는 경우
                    if(weight < sum + truck_weight){
                        q.add(0);
                        time++;
                    }                    
                    // 무게가 안 넘는 경우
                    else{
                        q.add(truck_weight);
                        time++;
                        sum += truck_weight;
                        break;
                    }
                }
            }
        }
        
        // 마지막 트럭이 나올 때 까지
        return time + bridge_length;
    }
}

🤔 나의 생각

Queue의 FIFO 성질을 사용해 문제를 해결했다.
먼저 경우들을 나누어 주었다.

  • 큐가 빈 경우
  • 큐 다리 길이만큼 트럭이 다 찬경우
  • 큐가 비지 않은 경우
    • 큐에 트럭이 있는 경우
      • 무게를 넘는 경우
      • 무게가 안 넘는 경우


큐에 트럭이 추가 되는 경우 시간, 무게를 추가하고 while문을 벗어나게 해주었다.
그리고 큐의 크기만큼 트럭이 찬 경우는 트럭이 나갈 시간이 다 되었단 의미이다.
마지막 트럭까지 다 나오는 경우를 계산해서 time + bridge_length 를 해주었다.