본문
다리를 지나는 트럭 #스택/큐 #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에 더해준 다음 리턴해준다.
댓글