본문 바로가기
Algorithm/Programmers

Programmers - 다리를 지나는 트럭🚛

by HaningYa 2020. 6. 25.
728x90

 

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

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

programmers.co.kr

 


문제

문제 설명

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

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

       
경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건

  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

입출력 예

return

       
bridge_length weigh truck_weights return
2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

FIFO - Queue 사용한다.

q1은 출발하지 않은 트럭이고 q2는 다리 위를 나타낸다.

q1의 peek 와 totalWeight 를 더한게 다리의 최대 하중 이하여야 한다.

조건을 만족시킬 경우 q2에 추가해 주고 totalWeight에도 추가해준다.

다리를 다 건너는 차량은 q2에서 빼야한다.

이건 Truck 의 pos값을 매 초마다 증가하여 다리를 다 건넌 시점을 판단한다.

import java.util.*;
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        Queue<Truck> q1 = new LinkedList();
        Queue<Truck> q2 = new LinkedList();
        
        for(int i : truck_weights){
            Truck t = new Truck();
            t.weight = i;
            t.pos = 0;
            q1.add(t);
        }
        int totalWeight = 0;
        
        while(q1.isEmpty() == false || q2.isEmpty() == false){
            answer++;
            // System.out.print(answer+"초 sum : ");
            // System.out.println(totalWeight);

            if(q1.isEmpty() == false){
                if(totalWeight + q1.peek().weight <= weight){
                    Truck t = q1.poll();
                    totalWeight += t.weight;
                    t.pos++;
                    q2.add(t);
                    // System.out.println("q1에서 뽑아서 q2로 " + t.weight);
                }
            }
            
            if(q2.peek().pos == bridge_length){
                totalWeight = totalWeight - q2.peek().weight;
                int w = q2.peek().weight;
                q2.poll();
                // System.out.println("다 건너서 없앰" + w);

            }
            
            for(Truck t : q2){
                t.pos++;
            }
        
        }
        answer++;
        return answer;
    }
}
class Truck {
    int weight;
    int pos;
}
728x90

'Algorithm > Programmers' 카테고리의 다른 글

Programmers - 라면공장🍜  (0) 2020.06.26
Programmers - 위장 🔫  (0) 2020.06.25
Programmers - 기능개발  (0) 2020.06.24
Programmers - 폰켓몬  (0) 2020.05.29
Programmers - 스킬트리  (0) 2020.05.29

댓글