본문 바로가기
정리/알고리즘

스택/큐 - 다리를 지나는 트럭

by Hudini30 2022. 2. 7.

프로그래머스(스택/큐) - 다리를 지나는 트럭

해당 문제는 다리를 지나는 트럭의 정보를 담은 큐(이하 BQ)를 사용하여 풀었습니다.
반복문을 전체 트럭이 도착할때까지 돌리며 해당 반복문이 돌때 마다 BQ에서 다리위 트럭의 정보를 뽑아 다리 길이와 같을 경우 도착으로 치고 그외의 트럭의 전체 무게와 이제 지나야 하는 트럭의 무게를 더해 그 무게가 다리가 견딜 수 있는 무게보다 작을 경우 BQ에 이제 지나야 하는 트럭의 정보를 집어 넣고 기존 BQ의 트럭의 위치도 1씩 움직이게 했습니다. 무게보다 크고 BQ에 트럭이 있는 경우에는 (다리 길이 - 처음 출발한 트럭의 현 위치)를 뺀 시간 만큼은 다른 트럭이 올라 갈 수 없으므로, 그 시간 만큼 현재 BQ 트럭의 위치를 옮겨주도록 했습니다.

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

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        int nextTruckIndex = 0;
        int totalTruckSize = truck_weights.length;
        Stack<Truck> arrivedTruck = new Stack<>();
        Queue<Truck> truckOnTheBridge = new LinkedList<>();

        while (arrivedTruck.size() < totalTruckSize) {
            int bridge_truck_total_weights = 0;
            int wait_truck_weight = nextTruckIndex < totalTruckSize ? truck_weights[nextTruckIndex] : 0;

            int movingTruckSize = truckOnTheBridge.size();

            for (int i = 0; i < movingTruckSize; i++) {
                Truck truck = truckOnTheBridge.poll();

                if (truck.getPosition() == bridge_length) {
                    arrivedTruck.push(truck);
                } else {
                    truckOnTheBridge.add(truck);
                    bridge_truck_total_weights += truck.getWeight();
                }
            }

            if (wait_truck_weight != 0 && bridge_truck_total_weights + wait_truck_weight <= weight) {
                truckOnTheBridge.add(new Truck(wait_truck_weight, 0));
                moveTruck(truckOnTheBridge, truckOnTheBridge.size(), 1);
                nextTruckIndex++;
                answer++;
            } else if (!truckOnTheBridge.isEmpty()) {
                Truck firstTruck = truckOnTheBridge.poll();

                int movingSecond = bridge_length - firstTruck.getPosition();

                answer += movingSecond;
                firstTruck.setPosition(bridge_length);
                truckOnTheBridge.add(firstTruck);
                moveTruck(truckOnTheBridge, truckOnTheBridge.size() -1, movingSecond);
            }
        }

        return answer + 1;
    }

    public void moveTruck(Queue<Truck> trucks, int movedTruckCount, int movedPosition) {
        for (int i = 0; i < movedTruckCount; i++) {
            Truck truck = trucks.poll();
            truck.setPosition(truck.getPosition() + movedPosition);
            trucks.add(truck);
        }
    }

    class Truck {
        int weight;
        int position;

        public Truck(int weight, int position) {
            this.weight = weight;
            this.position = position;
        }

        public void setPosition(int position) {
            this.position = position;
        }

        public int getPosition() {
            return position;
        }

        public int getWeight() {
            return weight;
        }
    }
}

'정리 > 알고리즘' 카테고리의 다른 글

힙(Heap) 더맵게  (0) 2022.02.09
스택/큐 - 주식가격  (0) 2022.02.08
해시 - 베스트앨범  (0) 2022.02.04
스택/큐 - 프린터  (0) 2022.02.03
스택/큐 - 기능개발  (0) 2022.02.03

댓글