알고리즘/프로그래머스

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

jimkwon 2022. 2. 11. 14:29
반응형

문제 링크

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

 

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

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다.

첫 구절을 읽자마자 뭐다? 큐다~ "정해진 순"과 같이 선입선출의 냄새를 풍기는 문제는 바로 큐를 파악해야 한다.

다리를 건너는 중인 트럭을 큐에 넣는다. 단, 큐에 삽입 전 다리의 무게를 넘지 않도록 고려한다.

큐에 들어가는 인자들은 [트럭이 다리를 다 건널때의 시간] = [현재 초 + 다리의 길이] 를 집어넣는다.

트럭이 다리를 다 건너면, 큐에서 해당 트럭을 빼고 대기중인 트럭을 넣을지 여부를 결정한다.

트럭이 모두 다리를 다 건너면 끝

 

import java.util.LinkedList;
import java.util.Queue;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 2;
        int totalWeight = truck_weights[0];
        int outIndex = 0; // 다리 빠져나오는 트럭
        int newIndex = 1; // 다리 들어오는 트럭
        Queue<Integer> que = new LinkedList<>();
        que.add(bridge_length + 1);
        
        while(outIndex != truck_weights.length) {
            if (que.peek() == answer) { // 맨 앞트럭이 다리 다 건넘
                que.poll();
                totalWeight -= truck_weights[outIndex];
                outIndex++;
                if (outIndex == truck_weights.length)
                    break;
            } // 다리에 새로운 트럭 출발
            if (newIndex != truck_weights.length && totalWeight + truck_weights[newIndex] <= weight) { 
                que.add(answer + bridge_length);
                totalWeight += truck_weights[newIndex];
                newIndex++;
            }
            answer++;
        }
        
        return answer;
    }
}

 

해당 풀이는 보시다시피 선언한 변수가 좀 많다.. 통과한 후 다른 사람 풀이를 보니 Class를 선언하여

이러한 불상사를 객체를 통해 보완하는 것을 확인할 수 있었다. 따라서 클래스를 이용한 풀이도 첨부한다.

import java.util.LinkedList;
import java.util.Queue;
class Solution {
    class truck {
        int time;
        int weight;
        
        public truck(int time, int weight) {
            this.time = time;
            this.weight = weight;
        }
    }
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 2;
        int totalWeight = truck_weights[0];
        Queue<truck> wait = new LinkedList<>();
        Queue<truck> running = new LinkedList<>();
        
        for(int truck : truck_weights)
            wait.add(new truck(bridge_length, truck));
        wait.poll();
        running.add(new truck(bridge_length + 1, truck_weights[0]));
        
        while(!(running.isEmpty() && wait.isEmpty())) {
            if (running.peek().time == answer) {
                totalWeight -= running.peek().weight;
                running.poll();
            }
            if (!wait.isEmpty() && totalWeight + wait.peek().weight <= weight) { 
                running.add(new truck(answer + wait.peek().time, wait.peek().weight));
                totalWeight += wait.poll().weight;
            }
            if (running.isEmpty() && wait.isEmpty())
                break;
            answer++;
        }
        
        return answer;
    }
}

다만, 실제로 코테를 보느 중에 클래스를 짜서 할 일이 있을까?.. 라는 생각

클래스를 짜지 않고도 풀 수 있는 문제들은 아마 첫 번째 풀이처럼 하지 않을까 싶다