문제 출처 - Programmers
문제는 여기
[풀이]
1. 큐가 비어 있으면 다리를 건너고 있는 차가 없다는 것이므로 큐에 현재 트럭을 넣어주고, 총무게에 현재 트럭의 무게를 증가시켜주고, 시간을 증가시켜 준다.
2. 큐의 길이가 다리의 길이와 같으면 총 무게에서 큐의 맨 처음 무게를 빼주고, 큐에서 맨 앞을 빼준다.
3. 다리길이만큼 큐가 차지 않았다면
3-1. 큐에 들어있는 무게 + 현재 트럭의 무게가 다리가 지탱할 수 있는 무게보다 크다면 큐에 0을 넣어주고 시간을 증가시킨다.
3-2. 아니라면 현재 트럭의 무게를 큐에 넣어주고 시간과 총무게를 증가시켜 준다.
4. 입력으로 주어지는 트럭의 수만큼 반복한다.
5. 마지막에 들어간 트럭이 시간과 마지막 트럭이 다리를 건너는데 걸리는 시간을 합친 것을 출력한다.
[접근]
1. 트럭들을 큐에 담아가면서 큐가 다 비워질 때, 총시간을 구해주면 되겠다고 생각하였다.
[코드]
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> queue = new LinkedList<>();
int weights = 0;
int time = 0;
for(int i = 0; i < truck_weights.length; i++) {
// 현재 트럭
int now = truck_weights[i];
while(true) {
// 큐가 비어있으면 트럭이 지나갈 수 있음
if (queue.isEmpty()) {
queue.add(now);
// 다리위에 있는 트럭의 무게
weights += now;
// 다리에 올라가는 시간
time++;
break;
}
// 큐의 길이가 다리의 길이와 같으면
else if (queue.size() == bridge_length) {
weights -= queue.poll();
}
// 다리 길이만큼 큐가 차지 않은 경우
else {
// 큐에 들어있는 트럭들의 무게와 현재 트럭의 무게가 다리가 견디는 무게보다 작거나 같으면
if (weights + now <= weight) {
// 현재 트럭을 큐에 넣어줌
queue.add(now);
weights += now;
time++;
break;
}
// 아니라면 큐에 0을 넣어줌
else {
queue.add(0);
time++;
}
}
}
}
// 걸린 시간 + 다리길이 (마지막 트럭도 다리 길이만큼 지나가야하기에)
return time + bridge_length;
}
}