백준 13335 - 트럭

Updated:

Java

13335 번 - 트럭

문제

접근 방법

다리를 Queue라고 생각하고 해결하였다.

만약 길이가 5인 다리가 있다 생각하면 다음과 같이 나타낸다.

0 0 0 0 0

여기서 트럭이 하나 추가되면,

0 0 0 0 5

이후 1초가 지나 트럭이 지나가고 다른 트럭이 하중에 의해 못올라오는 경우 다음과 같이 나타낸다.

0 0 0 5 0

이처럼 다리를 w개 크기만큼 고정되어있는 Queue라고 생각하여 해결하면 풀 수 있는 문제이다.

코드

import java.util.*;
import java.io.*;

public class Main {
	static int n, result, w, l;
	static Queue<Integer> road, bridge;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer stk = new StringTokenizer(br.readLine());
    	n = stoi(stk.nextToken());
    	w = stoi(stk.nextToken()); // 다리 길이
    	l = stoi(stk.nextToken()); // 최대 하중

    	road = new LinkedList<Integer>();
    	bridge = new LinkedList<Integer>();

    	stk = new StringTokenizer(br.readLine());
    	for(int i = 0; i < n; i++) {
    		road.add(stoi(stk.nextToken()));
    	}

    	for(int i = 0; i < w; i++) {
    		bridge.add(0);		// 다리 길이 만큼 채운다.
    	}

    	int front, briSum = 0, time = 0;

    	while(!road.isEmpty()) {	// 대기하고 있는 트럭이 모두 다리에 올라 갔을 때 종료
    		front = road.peek();
    		briSum -= bridge.poll();

    		if(briSum + front <= l) {	// 현재 선두에서 대기하는 트럭의 무게와 현재 다리의 하중의 합
    			bridge.add(road.poll());	// 다리에 추가한다.
    			briSum += front;
    		}
    		else {
    			bridge.add(0);	// 빈 공간을 다리에 추가한다.
    		}

    		time++;
    	}

    	System.out.println(time + w);	// 마지막 트럭이 다리에 진입하였으므로, 다리 길이만큼 시간을 더한다.
    	br.close();
	}

	static int stoi(String str) {
    	return Integer.parseInt(str);
    }
}

총평

후기

개선할 점