99클럽 코테 스터디 3주차 보너스문제 TIL
💙 JAVA 비기너
네?
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
int time = 0;
int bridge_weight = 0;
Queue<Integer> bridge = new LinkedList<>();
for(int truck : truck_weights) {
while(true) {
if(bridge.size() == bridge_length) {
bridge_weight -= bridge.poll();
} else if(weight >= bridge_weight + truck) {
bridge.add(truck);
bridge_weight += truck;
time++;
break;
} else {
bridge.add(0);
time++;
}
}
}
return time + bridge_length;
}
}
문제가 이해가 가도 어떻게 풀어야하나 계속 노려봤다...
길이 1당 1초가 걸리는 도로가 있는데 무게 제한을 안넘기고 한대씩 차례대로 보냈을 때의 시간을 구하면 되는 것이다.
처음엔 while문만 쓰기도 하고 for문만 쓰기도 하고 왔다갔다 했는데 결국 둘 다 쓰는 걸로 제출했다.
트럭을 한대씩 차례대로 보내야하므로 foreach문을 통해 트럭 한대씩 기회(?)를 주고 while문을 통해 도로 진출할 때까지 로직을 반복했다.
while문에서 확인해야하는 조건은 다음과 같았다.
1. 다리가 꽉 찼을 경우
2. 다리 위에 트럭을 더 올릴 수 있는 경우
3. 다리는 꽉 안찼지만 다리 위에 트럭을 더 못올리는 경우
가장 먼저 다리가 꽉 찼는지를 확인하는 이유는 무게가 허용범위여도 트럭이 올라갈 공간이 없다면 못올리기 때문이다.
그래서 가장 먼저 bridge.size() == bridge_length
로 다리 위에 올라가 있는 트럭의 수와 다리의 길이를 비교해줬다.
만약 다리 위가 다 찼다면 가장 앞에 있는 트럭을 보내주고 다리 위 무게의 총합인 bridge_weight
에서 가장 앞에 있는 트럭의 무게를 빼줬다 bridge_weight -= bridge.poll();
.
두번째는 현재 다리 위 무게와 이번 차례인 트럭 무게의 합이 다리가 허용하는 최대 무게보다 작거나 같다면 트럭을 다리 위에 올리는 것이다.
다리에 트럭을 올려주고 bridge.add(truck);
, 현재 다리 무게에 트럭의 무게를 합해준다 bridge_weight += truck;
. 시간도 증가해주고 이 트럭에 대해 더 할 수 있는 기능이 없으므로 break();
을 통해 while문에서 벗어나 다른 트럭에게 차례를 넘긴다.
마지막으로 다리가 꽉 차지도 않았는데 무게도 허용범위 밖이다? 트럭을 다리에 올리지 않고 맨 앞에 있는 트럭을 보내야한다. 하지만 시간도 증가해야하기 때문에 어떻게 해야할까 고민을 많이 했는데 더미데이터를 넣어줘서 다리를 꽉 차게 만들어야겠다고 생각했다. 그렇게 다리가 꽉 차게 되면 맨 앞 트럭을 다리 밖으로 내보낼 수 있기 때문이다.
truck_weights
의 길이는 1 이상 10,000 이하이므로 더미데이터로 범위 밖 값인 0을 넣어줬다. 논리적으로는 트럭이 거리 1을 지난 것이므로 시간도 추가해줬다.
마지막으로 시간을 반환할 때 마지막 트럭이 입장만 한 상태이고 아직 다리를 끝까지 건넌 상황이 아니므로 지금까지 걸린 시간time
에 다리의 길이bridge_length
를 더해서 마지막 트럭까지 모두 다리를 건넌 시간을 반환해줬다.