티스토리 뷰

PS/programmers

Level2) 다리를 지나는 트럭

kingsubin 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