알고리즘/스택 큐

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

연향동큰손 2025. 3. 9. 18:49

https://school.programmers.co.kr/learn/courses/30/lessons/42583?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

처음에는 문제 이해가 어려웠지만 몇가지 규칙만 이해하고 큐를 사용하면 쉽게 해결 가능한 문제이다.

 

  • 다리에 트럭이 한대도 없는 경우 : 트럭을 큐에 추가
  • 트럭이 다리에 꽉 찬경우 : 트럭을 큐에서 삭제
  • 다리에 트럭이 꽉 차지 않은 경우 : 트럭을 큐에 추가하거나 트럭을 앞으로 이동시킴

단, 주의 할 점은 마지막 트럭이 내릴때의 시간까지 구하기 위해 

 

return 값은 time + bridge_length로 해줘서 정확한 결과를 리턴해줘야 한다.

 

또한, 다리에  트럭이 다 차지 않았는데, 다음 트럭이 무게때문에 들어올 수 없는 경우는 queue.add(0)을 해줘서 sum변수에 영향이 안가도록 해줘야 한다.

 

<전체 코드>

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int sum = 0;
        int time = 0;
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0; i<truck_weights.length; i++){
           int truck = truck_weights[i];
            
            while(true){
                if(queue.isEmpty()){ //다리에 트럭이 한대도 없는 경우
                    queue.add(truck);
                    time++;
                    sum+=truck;
                    break;
                }
                else if(queue.size() == bridge_length){ //다리에 트럭이 다 찬 경우
                    sum-=queue.poll();
                }
                else{ //다리의 길이만큼 트럭이 차지 않은 경우
                    if(sum+truck<=weight){ //트럭이 다리위에 더 들어올 수 있는 경우
                        queue.add(truck);
                        sum+=truck;
                        time++;
                        break;
                    }else{ //0을 큐에 넣어서 sum에 영향을 안주도록 한다.
                        queue.add(0);
                        time++; 
                    }
                }
            }
        }
        
        return time+bridge_length;
    }
}