ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Level2) 다리를 지나는 트럭
    PS/programmers 2020. 10. 11. 15:57
    import java.util.*;
    
    public class Solution {
        public int solution(int bridge_length, int weight, int[] truck_weights) {
            int time = 0;
            Queue<Truck> boarding = new LinkedList<>();
            Queue<Truck> waiting = new LinkedList<>();
    
            for (int t : truck_weights) {
                waiting.offer(new Truck(t, bridge_length));
            }
    
            int remain_weight = weight;
            while (!(waiting.isEmpty() && boarding.isEmpty())) {
                if (!waiting.isEmpty()) {
                    int nowWeight = waiting.peek().weight;
                    if (remain_weight - nowWeight >= 0) { // 대기열 맨 앞의 트럭을 태울 수 있는가 ?
                        remain_weight -= nowWeight; // 무게 업데이트
                        boarding.offer(waiting.poll()); // 탑승
                    }
                }
    
                // 탑승을 하던 탑승을 하지 않던 현재 탑승한 트럭의 거리는 1만큼 줄어들고 시간은 1 늘어난다
                if (!boarding.isEmpty()) {
                    Iterator<Truck> it = boarding.iterator();
                    while (it.hasNext()) {
                        Truck next = it.next();
                        next.distance--;
                        if (next.distance == 0) {
                            remain_weight += next.weight;
                        } else if (next.distance < 0) {
                            it.remove();
                        }
                    }
                    time++;
                }
    
            }
            return time;
        }
    }
    
    class Truck {
        int weight;
        int distance;
    
        public Truck(int weight, int distance) {
            this.weight = weight;
            this.distance = distance;
        }
    }
    

     

    - Stack/Queue, FIFO인 걸로 봐서 Queue 사용해야겠다고 생각

    - waiting, boarding 이렇게 2개의 큐 사용

    - 작성하다보니 다리의 길이를 어떻게 해야 할까 하다가 클래스 하나에 길이를 넣고 같이 묶어서 큐에 넣음

    - 완료가 된다는건 대기 중인 트럭도 없고, 다리에 올라간 트럭도 없다는 거니까 두 개의 큐가 전부 빌 때까지 반복

    - 대기열 맨 앞의 트럭의 무게를 계산해서 탑승이 가능한가 ? 를 구분함

    - 가능하다면 remain_weight를 업데이트해주고 탑승 

    - 다리에 올라간 트럭들의 distance를 1씩 감소시켜주고 시간도 1초씩 증가시켜줌

    - 만약 distance가 0이라면 remain_weight을 업데이트 시켜줘야 1초 후 이 트럭이 나가면서 새로운 트럭이 들어올 수 있음

    - distance가 0 이하일 때 제거

     

    - 오래 걸렸는데 좀 기분 좋게 풀이 성공

    - 다른 사람 풀이 보는 거보다 내가 처음 생각한 대로 따라가는 게 이해가 잘됨 

    'PS > programmers' 카테고리의 다른 글

    Level2)가장 큰 수  (0) 2020.11.10
    Level2) 기능개발  (0) 2020.11.10
    Level2) 주식가격  (0) 2020.10.09
    Level2) 프린터  (0) 2020.10.09
    Level1) 두 개 뽑아서 더하기  (0) 2020.10.08
킹수빈닷컴