안녕하세요 호호만두에요
이 문제는 큐(Queue)를 이용하여 풀 수 있는 문제에요
자바에서 기본으로 주어지는 queue을 이용하여 풀면 됩니다.
queue은 java.util.Queue와 java.util.LinkedList를 import하면 사용할 수 있습니다.
<문제 풀이 방법>
1. 트럭을 차례차례 다리에 놓기 위해서 큐에 넣습니다.
2. 트럭을 담은 weights 큐에서 맨 앞의 트럭을 뽑습니다.(직접 poll로 뽑지는 않고 peek로 값 확인)
3. total 변수를 이용하여 현재 다리 위의 트럭의 무게를 관리합니다.
4. 버틸 수 있는 다리의 무게(wieght) >= 현재 다리위의 트럭의 무계(total) + 현재 트럭의 무게(truck_weight)면 다리를 지나가게 합니다.
5. 그리고 시간을 increase 함수를 통해 증가시킵니다. 다리를 지나는 트럭을 관리하는 queue에 있는 truck들의 시간을 증가시킵니다.
6. 총 흐른 시간을 증가 시킵니다(answer++)
7. queue의 맨 앞의 트럭이 다리를 모두 건넜다면, 즉 시간이 다리 길이와 같다면 지나간것이 되므로 queue에서 제거합니다.
8. 트럭을 담은 weights의 모든 원소가 없어질때까지 반복하며 모두 없어진 경우 다리 위에 남아있는 마지막 트럭을 처리하기 위해 총 시간에 다리 길이 만큼 더해줍니다.
<프로그래머스 다리르 지나는 트럭 자바(Java) 풀이>
import java.util.Queue;
import java.util.LinkedList;
class Truck{
int truck_num;
int sec;
Truck(int truck_num, int sec){
this.truck_num = truck_num;
this.sec = sec;
}
public void increase(){
this.sec ++;
}
}
class Main{
public static void main(String[] args){
int bridge_length = 2;
int weight = 10;
int[] truck_weights = {7,4,5,6};
int bridge_length2 = 100;
int weight2 = 100;
int[] truck_weights2 = {10};
int bridge_length3 = 100;
int weight3 = 100;
int[] truck_weights3 = {10, 10, 10, 10, 10, 10, 10, 10, 10, 10};
int answer = solution(bridge_length3, weight3, truck_weights3);
System.out.println(answer);
}
// 모든 트럭이 다리를 건너는데 걸리는 최소시간 구하기
// 트럭은 1초에 1만큼 움직임
// bridge_length : 다리 길이
// weight : 다리가 견디는 최대 무게
// * 트럭이 다리에 완전히 올랐을 경우 무게 측정
static Queue<Truck> queue;
public static int solution(int bridge_length, int weight, int[] truck_weights) {
int answer = 0;
int total = 0;
queue = new LinkedList<>();
Queue<Integer> weights = new LinkedList<>();
for (int i = 0; i < truck_weights.length; i++) {
weights.offer(truck_weights[i]);
}
while(true){
int truck_weight = weights.peek();
// 건너고 있는 트럭의 무게가 weight보다 작을 경우만
if(total + truck_weight <= weight){
weights.poll();
Truck truck = new Truck(truck_weight, 0);
queue.offer(truck);
total += truck_weight;
}
increase();
answer++;
if(queue.peek().sec == bridge_length){
Truck out = queue.poll();
total -= out.truck_num;
}
if(weights.size() == 0){
answer += bridge_length;
break;
}
}
return answer;
}
public static void increase(){
Queue<Truck> temp = new LinkedList<>();
while(true){
Truck truck = queue.poll();
truck.increase();
temp.offer(truck);
if(queue.size() ==0)
break;
}
queue = temp;
}
}