Algorithm/Programmers

[Programmers] 다리를 건너는 트럭

goakgoak 2020. 5. 30. 18:57

[Level 2] 다리를 건너는 트럭

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

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

 

 

Solution

  • waitingQ에서 대기 하는 차의 무게가 다리가 지탱할 수 있는 무게보다 작거나 같을 때 다리위 트럭을 의미하는 onBridge 리스트에 추가한다.
  • while문에서는 시간을 증가하고, onBridge 리스트에 추가하면서 설정했던 트럭의 다리건너는 시간이 time과 일치하면 onBridge 리스트에서 remove해준다. 그리고 count++

 

 

소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.LinkedList;
import java.util.Queue;
 
class Solution {
   static Queue<Truck> waitingQ;
    static LinkedList<Truck> onBridge;
    static int answer;
 
    static class Truck {
        private int weight, exit;
 
        public Truck(int weight) {
            this.weight = weight;
            this.exit = 0;
        }
    }
 
    public static int solution(int len, int weight, int[] truck_weights) {
        init();
        for (int i = 0; i < truck_weights.length; i++) {
            waitingQ.offer(new Truck(truck_weights[i]));
        }
        int time = 0, weightSum = 0, count = 0;
        while (true) {
            time++;
            // 다리 위 트럭 시간 체크
            if (!onBridge.isEmpty()) {
                if (onBridge.getFirst().exit == time) {
                    Truck t = onBridge.removeFirst();
                    weightSum -= t.weight;
                    count++;
                    
                    if(count == truck_weights.length)
                        break;
                }
            }
            
            if (!waitingQ.isEmpty() && weightSum + waitingQ.peek().weight <= weight) {
                Truck t = waitingQ.poll();
                t.exit = time + len;
                onBridge.addLast(t);
                weightSum += t.weight;
            }
        }
        answer = time;
        System.out.println(answer);
        return answer;
    }
 
    public static void init() {
        answer = 0;
        onBridge = new LinkedList<>();
        waitingQ = new LinkedList<>();
    }
}
cs