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

chaemin·2024년 5월 14일
0

프로그래머스

목록 보기
43/64

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/42583

2. 풀이

Queue를 사용해야겠다는 생각은 들었는데 정확히 어떤 부분을 사용해야할지 감이 안왔다. 풀이를 보고 Queue에 0을 삽입하는게 굉장히 독특한 아이디어였다.

  1. 다리를 Queue라고 놓고 최대 올라갈 수 있는 bridge_length만큼 0을 채워준다.
    ex) 0 0
  1. 다리의 총 무게가 얼마인지 더하는 bridgeW 변수를 설정하고, time++전 마다 bridgeW에서 queue에서 poll한 값을 빼준다.
bridgeW -= q.poll();
  1. 다음 값이 다리 위에 올라올 수 있는지 확인. ✨안된다면 Queue에 0을 삽입한다.
int nowTruckW = truck_weights[truckIndex];
if(bridgeW + nowTruckW <= weight){
	bridgeW += nowTruckW;
	q.add(nowTruckW);
	truckIndex++;
} else{
	q.add(0);
}
  1. 초기 조건식이 truckIndex < 배열 length 이기 때문에 그 이후에도 다리를 못빠져나온 트럭이 있으면 수행해준다.

3. 전체 코드

import java.util.*;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> q = new LinkedList<>();
        
        // 1. Queue를 bridge_length만큼 채워준다.
        for(int i = 0; i < bridge_length; i++){
            q.add(0);
        }
        
        // 2.
        int truckIndex = 0;
        int time = 0;
        int bridgeW = 0;
        while(truckIndex < truck_weights.length){
            bridgeW -= q.poll();
            int nowTruckW = truck_weights[truckIndex];
            
            if(bridgeW + nowTruckW <= weight){
                bridgeW += nowTruckW;
                q.add(nowTruckW);
                truckIndex++;
            } else{
                q.add(0);
            }
            
            time++;
        }
        
        while(bridgeW > 0){
            bridgeW -= q.poll();
            time++;
        }
        
        return time;
    }
}

0개의 댓글