알고리즘

백준 13335번 트럭 (JAVA)

박카스마시며코딩 2022. 8. 5. 23:25

https://www.acmicpc.net/problem/13335

 

13335번: 트럭

입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트

www.acmicpc.net

 

저는 구현을 통해서 문제를 해결하였습니다.

저는 큐를 통해 다리에 존재하는 트럭을 추적하였습니다.

현재 다리에 있는 무게를 추적하고 트럭이 들어갈 수 있는지를 확인하고 들어가지 못한다면 들어갈 수 있을 때까지 큐에서 트럭을 빼고 들어가야할 트럭을 넣었습니다.

마지막으로 들어가있는 트럭을 모두 빼면서 시간을 추적하였습니다.

 

package BOJ.etc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_13335 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int w = Integer.parseInt(st.nextToken());
        int l = Integer.parseInt(st.nextToken());
        int[] input = new int[n];
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }
        int result = cal(input, n, w, l);
        System.out.println(result);
    }

    private static int cal(int[] input, int n, int w, int l) {
        Queue<int[]> q = new LinkedList<>(); // int[] {무게,시간}
        int weight = 0;
        int time = 0;
        for (int i = 0; i < n; i++) {
            while (!q.isEmpty() && weight + input[i] > l) {
                int[] now = q.poll();
                weight -= now[0];
                time = Math.max(time,now[1] + w - 1);
            }
            time++;
            q.offer(new int[]{input[i], time});
            weight += input[i];
        }
        while (!q.isEmpty()) {
            int[] now = q.poll();
            time = now[1] + w;
        }
        return time;
    }
}