새소식

알고리즘 문제풀이/프로그래머스

[프로그래머스] 다리를 지나는 트럭, 큐(Queue)문제 자바 풀이

  • -

안녕하세요 호호만두에요

이 문제는 큐(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;
    }
}





Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.