
가. 문제 설명
다리를 일정 길이만큼 일정 무게 안에서 트럭들이 지나야한다.
만약 다리길이가 2라면 트럭은 2초동안 다리에 머무른다. 그리고 다리위에 이동하는 트럭이 이동하는 그 같은 순간에 다리 무게 조건에 부합하면 다음 트럭이 들어올 수 있다.
나. 접근 방법
필자가 생각하기에 이 문제의 키 포인트는 세가지이다.
Point 1. 다리에서
나가는 트럭과 들어오는 트럭이 같은 시간(초)에 이루어진다는 것을 인지할 수 있냐.
Point 2. 다리위에서 시간이 흐르는 것을 어떤 방식으로 표현할 것이냐.
필자는 숫자 "0"을 사용하였다.
Point 3. Time은 어느 순간에 결정되냐?
Time은 다리위에 트럭이 더이상 존재하지 않는 순간에 결정된다.
다. 문제 유형
큐
가. 다리에 값이 존재할 때 까지 반복
일단 다리 위에 있는 트럭들을 치우는 것이 목표이기 때문이다.
while(bridge.size() != 0){
time++;
나. 다리에서 하나 꺼내고 해당 무게 다리 무게에서 빼기
0이 될 수도 혹은 트럭이 될 수도 있다.
만약 트럭이면 다리무게는 그대로일 것이고, 트럭이면 해당 트럭이 빠졌으니 다리에서 해당 트럭 무게를 빼면 될 것이다.
int out = bridge.poll();
bridge_weight-=out;
다. 대기 트럭 확인
위의 "문제 배경"의 접근방법 1에서 말했듯이, 다리위에 무언가가 빠지는 순간 다리에도 하나 들어와야한다. 그렇기 때문에 들어올 트럭이 있는가를 확인한다.
if(trucks.size() !=0){
1. 만약 들어올 트럭이 있다면?
들어올 트럭과 현재 다리 무게의 합이 문제에서 정의한 최대무게보다 작아야한다.가.만약 이 조건을 만족한다면 다리위에 트럭을 넣고 다리 무게를 갱신하면 된다.
if(bridge_weight+trucks.peek()<=weight){ int now_truck=trucks.poll(); bridge.add(now_truck); bridge_weight+=now_truck; }나.만약 이 조건을 만족하지 못한다면 0을 추가한다.
0이라는 존재는트럭이 다리위의 어느 지점을 통과하고 있냐를 계산해주는 아주 중요한 친구이다.else{ bridge.add(0); }2. 만약 들어올 트럭이 없다면 아무것도 하지 않는다.
그래야지만 다리위에 남은 0이 흘러가서 time을 갱신해주기 때문이다. 결국 다리에 남은 것이 없을 때, time은 결정된다.
라.Time 반환
return time;
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
Queue<Integer> bridge = new LinkedList<Integer>();
Queue<Integer> trucks = new LinkedList<Integer>();
int time =0;
int bridge_weight=0;
for (int i=0; i<bridge_length; i++){
bridge.add(0);
}
for (int t : truck_weights){
trucks.add(t);
}
while(bridge.size() != 0){
time++;
int out = bridge.poll();
bridge_weight-=out;
if(trucks.size() !=0){
if(bridge_weight+trucks.peek()<=weight){
int now_truck=trucks.poll();
bridge.add(now_truck);
bridge_weight+=now_truck;
}
else{
bridge.add(0);
}
}
}
return time;
}
}
트럭이 들어옴과 나감을 같은 초안에서 이루어진다고 생각하고 구현하는 점이 굉장히 쉽지않았다.