송민준의 개발노트

프로그래머스 다리를 지나는 트럭 본문

알고리즘/프로그래머스

프로그래머스 다리를 지나는 트럭

송민준 2021. 2. 3. 00:06

programmers.co.kr/learn/courses/30/lessons/42583

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr

Truck이라는 클래스를 만들어서 접근

최초에는 Truck이 다리중량이 남는다면 동시에 여러대도 들어갈 수 있는 줄 알고 접근을 했다.

하지만 문제 예시를 보면

* 3 [7] [4] [5,6]
* 4 [7] [4,5] [6]

위와 같이 순서대로 4, 5가 들어가는 걸 볼 수가 있다.

 

import java.util.LinkedList;
import java.util.Queue;

public class TruckPassingTheBridge {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        // 대기트럭
        Queue<Truck> waiting = new LinkedList<>();
        // 다리
        Queue<Truck> bridge = new LinkedList<>();

        // 대기트럭 담음
        for(int i = 0 ; i < truck_weights.length ; ++i){
            waiting.offer(new Truck(truck_weights[i], 0));
        }

        int time = 0;
        int totalWeight = 0;
        // 대기트럭이 있거나 다리를 건너고 있으면 계속 실행
        while(!waiting.isEmpty() || !bridge.isEmpty()){
            // 시간은 항상 흐름
            time++;
            // 다리를 건너고 있다면
            if(!bridge.isEmpty()) {
                Truck t = bridge.peek();
                // 현재시간에서 트럭의 출발시간 뺀 값이 브릿지길이보다 길거나 같다면 다리에서 제외
                if(time - t.getPassTime() >= bridge_length) {
                    totalWeight -= t.getWeight();
                    bridge.poll();
                }
            }
            // 대기차가 있다면
            if(!waiting.isEmpty()) {
                // 중량보다 현재 총중량+들어갈차례의 차량무게가 작거나 같다면
                if(totalWeight + waiting.peek().getWeight() <= weight) {
                    // 트럭이 출발함(이 때 출발 시간은 트럭에 보관 -> 나중에 시간 비교해야함)
                    Truck t = waiting.poll();
                    totalWeight += t.getWeight();

                    bridge.offer(new Truck(t.getWeight(), time));
                }
            }
        }
        return time;
    }

}

class Truck {
    private int weight;
    private int passTime;
    public Truck(int weight, int passTime) {
        this.weight = weight;
        this.passTime = passTime;
    }
    int getWeight() {
        return weight;
    }
    int getPassTime() {
        return passTime;
    }
}