본문

다리를 지나는 트럭 #스택/큐 #level2

반응형

 

💡 풀이

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
public class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
		
        Queue<Integer> q = new ConcurrentLinkedQueue<>();
        int sum = 0;
        for(int t : truck_weights) {
            while(true) {
                if(q.isEmpty()) {
                    q.add(t);
                    sum += t;
                    answer++;
                    break;
                } else if(q.size() == bridge_length) {
                    sum -= q.poll();
                } else {
                    if(sum + t > weight) {
                        answer++;
                        q.add(0);
                    } else {
                        q.add(t);
                        sum+=t;
                        answer++;
                        break;
                    }
                }
            }
        }
        return answer + bridge_length;
    }
}

 

우선 Queue객체를 생성해준다.
forEach를 통해 트럭의 수만큼 반복한다.

첫 번째 조건은 Queue가 비어있는 경우다. 
이 경우에는 트럭이 무조건 진입가능 하기 때문에 바로 큐에 add()해주고
다리 위 트럭들의 무게를 의미하는 sum변수에 진입한 트럭의 무게를 더해준다.
시간(초)을 의미하는 answer도 트럭이 진입했기 때문에 1을 더해준다.

두 번째 조건은 Queue객체의 사이즈가 다리의 길이와 같은 경우다.
이 경우는 Queue가 가득차 있다는 의미이며 동시에 가장 먼저 진입한 트럭이 다리의 끝자락에 다다랐다는 의미기도 하다.
그렇기 때문에 이 트럭을 다리 밖으로 지나가게 하기 위해 poll() 메서드를 이용한다.
그리고 다리 위 트럭들의 무게를 의미하는 변수 sum에서 다리를 빠져나간 트럭의 무게를 빼준다.

세 번째 조건은 위 두 조건에 해당하지 않은 경우다. 즉 트럭이 다리 위에 있지만 Queue가 가득 차 있지 않은 상태이다.
이 때는 이미 다리 위의 있는 트럭들의 무게와 새롭게 진입할 트럭의 무게의 합이 weights(다리가 버틸 수 있는 무게)를 초과하는지 아닌지 조건을 검사한다.
만약 weights보다 크다면 새로운 트럭은 진입할 수 없다 그렇기 때문에 Queue에는 0을 넣어서 이미 Queue에 있는 트럭이 혼자 다리를 지나가도록 해준다.
그렇지 않고 weights보다 작다면, 새로운 트럭이 진입할 수 있다. 이 때는 첫 번째 조건과 마찬가지로 Queue에 새로 진입할 트럭을 넣어주고 sum에 새롭게 진입한 트럭의 무게를 더해준다. 

모든 트럭들이 다리에 진입하고 이 다리를 모두 지나가야 하기 때문에 다리의 길이만큼 answer에 더해준 다음 리턴해준다.

 

 

https://jaebworld.tistory.com/42

반응형

공유

댓글