Gidhub BE Developer

[Programmers] 다리를 지나는 트럭

2021-01-19
goodGid

다리를 지나는 트럭

Problem

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

Example


[1] Code (21. 01. 18)

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int idx = 0;
        int time = 0;
        int weightSum = 0;
        Queue<Truck> queue = new LinkedList<>();

        do {
            weightSum += clearQueueAndGetWeightSum(queue);
            time++;
            if (isAvaiablePush(truck_weights, weightSum, idx, weight)) {
                weightSum += truck_weights[idx];
                Truck truck = new Truck(truck_weights[idx], bridge_length - 1);
                queue.add(truck);
                idx++;
            }
        } while (!queue.isEmpty());
        return time;
    }

    private int clearQueueAndGetWeightSum(Queue<Truck> queue) {
        int weightSum = 0;
        int size = queue.size();

        for (int i = 0; i < size; i++) {
            Truck truck = queue.poll();
            weightSum -= truck.getTruckWeight();
            if (truck.getLength() != 0) {
                truck.setLength(truck.getLength() - 1);
                weightSum += truck.getTruckWeight();
                queue.add(truck);
            }
        }

        return weightSum;
    }

    private boolean isAvaiablePush(int[] truck_weights,
                                   int weightSum,
                                   int idx,
                                   int weight) {
        if (idx == truck_weights.length) {
            return false;
        }
        return weightSum + truck_weights[idx] <= weight;
    }

    private class Truck {
        int truckWeight;
        int length;

        public Truck(int truckWeight, int length) {
            this.truckWeight = truckWeight;
            this.length = length;
        }

        public int getTruckWeight() {
            return truckWeight;
        }

        public void setTruckWeight(int truckWeight) {
            this.truckWeight = truckWeight;
        }

        public int getLength() {
            return length;
        }

        public void setLength(int length) {
            this.length = length;
        }
    }
}
  • 풀고 보니 그냥 truck.length 이렇게 접근해도 되었으므로 getter/setter는 필요 없었다.

    수도 코드를 손으로 작성 후 코드로 옮겨서 풀어보니 어렵지 않게 풀 수 있었다.


Reference


Recommend

Index