https://school.programmers.co.kr/learn/courses/30/lessons/42583
이 문제는 저번에 틀렸는데
다시 풀어보려고 도전했다가
어쩔 수 없이 다른 분의 풀이를 보고 풀었습니다.
처음에 제가 접근했던 방법은
내부 클래스를 만들어서 트럭이 전진한 다리의 위치와 무게를 저장하는 객체를 선언했습니다.
이 객체를 Queue에 넣는 방식으로 했는데
도저히 답에 가까이 갈 수 없었습니다.
다리에서 트럭을 빼낼 때 Queue의 사이즈가 bridge_length인 경우에 빼내는 것이기 때문에
만약에 다리에 올릴 수 있는 트럭은 있지만 무게 제한으로 인해 못 올리는 경우에는 0을 넣어서 Queue의 사이즈가 bridge_length가 되도록 했다.
그래서 Queue에 넣어진 truck을 빼내는 방법으로 구현했다.
문제는 최소 시간을 구하는 것이기 때문에 Queue에 값을 넣을 때마다 시간이 흐르도록 하였다. truck이 전진하는 것은 Queue에 값을 넣을 때의 상황이기 때문이다.
마지막에 bridge_length를 answer에 더하는데
다리의 길이만큼의 시간을 모든 트럭들이 공유하고 있기 때문이다.
대기하는 트럭이나 다리를 지나는 트럭이나 모두 다리의 길이 만큼 시간을 공유한다.
import java.util.*;
class Solution {
static class Truck{
int weight;
int road;
public Truck(int weight, int road){
this.weight = weight;
this.road = road;
}
}
public int solution(int bridge_length, int weight, int[] truck_weights) {
//일차선 다리를 정해진 순서 모든 트럭이 다리는 건너려면 최소 몇초
//다리에는 츠럭이 최대 bride_length대 올라갈 수 있음
//다리는 weight이하까지의 무게 견딜 수 있음
int answer=0;
int index=0;
int bridge_weight =0;
Queue<Truck> q = new LinkedList<>();
while(index<=truck_weights.length-1){
if(truck_weights[index]+bridge_weight<=weight && q.size()<bridge_length){
q.offer(new Truck(truck_weights[index],1));
index++;
bridge_weight=truck_weights[index]+bridge_weight;
}else{
int size = q.size();
for(int i=0;i<size;i++){
Truck a = q.poll();
bridge_weight=bridge_weight-a.weight;
if(a.road<bridge_length) {
q.offer(new Truck(a.weight,a.road+1));
bridge_weight=bridge_weight+a.weight;
}
}
}
answer++;
}
return answer;
}
}
import java.util.*;
class Solution {
public int solution(int bridge_length, int weight, int[] truck_weights) {
//일차선 다리를 정해진 순서 모든 트럭이 다리는 건너려면 최소 몇초
//다리에는 츠럭이 최대 bride_length대 올라갈 수 있음
//다리는 weight이하까지의 무게 견딜 수 있음
int answer=0;
int bridge_weight =0;
Queue<Integer> q = new LinkedList<>();
for(int i=0;i<truck_weights.length;i++){
int truck = truck_weights[i];
while(true){
if(q.isEmpty()){
bridge_weight+=truck;
q.offer(truck);
answer++;
break;
}else if(q.size() == bridge_length ){
bridge_weight-=q.poll();
}else{//다리에 올려진 트럭의 수가 다리 길이보다 적은 상태
// 다리에 올려진 트럭의 무게가 제한 무게보다 적은 상태
if(bridge_weight+truck <= weight){
bridge_weight+=truck;
q.offer(truck);
answer++;
break;
}else{ // 제한 무게인 상태
q.offer(0);
answer++;
System.out.println("0");
}
}
}
}
return answer + bridge_length;
}
}