ALGORITHM/프로그래머스 | 백준 | 삼성 | 카카오

[백준] 13335번 트럭

SZCODE 2020. 4. 2. 00:39

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

 

13335번: 트럭

문제 강을 가로지르는 하나의 차선으로 된 다리가 하나 있다. 이 다리를 n 개의 트럭이 건너가려고 한다. 트럭의 순서는 바꿀 수 없으며, 트럭의 무게는 서로 같지 않을 수 있다. 다리 위에는 단지 w 대의 트럭만 동시에 올라갈 수 있다. 다리의 길이는 w 단위길이(unit distance)이며, 각 트럭들은 하나의 단위시간(unit time)에 하나의 단위길이만큼만 이동할 수 있다고 가정한다. 동시에 다리 위에 올라가 있는 트럭들의 무게의 합은 다리의 최

www.acmicpc.net

목표 : 모든 트럭들이 다리를 건너는 최단시간 구하기
조건 : 다리 길이만큼만 트럭이 올라갈 수 있는데, 트럭의 무게의 합이 다리의 최대하중보다 작거나 같아야한다.

다리를 큐로 선언
트럭을 모두 큐에 넣어보기 위해 트럭의 개수만큼 for문을 돌린다.

while문을 돌리면서 모든 조건을 검사

1. 다리에 트럭이 없을 때(큐가 비어있을 때)
    큐에 현재 트럭을 넣고, 시간을 증가, 다리의 무게 증가, while문 빠져나옴

2. 다리에 트럭이 있을 때

    2.1 현재 넣으려는 트럭의 무게와 다리에 있는 트럭의 무게를 합친 것이 최대하중보다 더 크면
         큐에 0을 추가해주고, 시간을 증가

    2.2 현재 넣으려는 트럭의 무게와 다리에 있는 트럭의 무게를 합친 것이 최대하중보다 같거나 작으면
         큐에 현재 트럭을 넣고, 시간을 증가, 다리의 무게 증가,while문을 빠져나옴

3. 트럭의 대수가 다리의 길이와 같을 때 (큐의 사이즈가 다리의 길이)
    큐에서 맨 앞 트럭 삭제, 삭제한 트럭만큼 다리 무게 감소


주의 : 모든 시간을 구한 후 마지막 트럭이 건너는 시간(다리의 길이)까지 더해줘야한다.
         무게에 지장이 없는 0을 큐에 넣어주고 while문이 끝나지 않아야한다.
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		Queue<Integer> queue = new LinkedList();

		int N = sc.nextInt(); // 트럭의 개수
		int W = sc.nextInt(); // 다리 길이
		int L = sc.nextInt(); // 다리 최대 하중

		int time = 0;//시간
		int weight = 0;// 다리에 있는 트럭의 무게
		int[] truck = new int[N]; 

		for (int i = 0; i < N; i++) {
			truck[i] = sc.nextInt();
		} // end of input

		for (int i = 0; i < N; i++) { 
			while (true) {
				if (queue.isEmpty()) {// 다리에 아무것도 없으면
					queue.offer(truck[i]);
					time++; 
					weight += truck[i]; 
					break;

				} else if (queue.size() == W) {// 큐의 사이즈가 다리의 길이이면
					weight -= queue.remove();
					
				} else { //다리에 트럭이 있을 때
					if (weight + truck[i]> L) { //현재 트럭의 무게 + 다리에 있는 트럭의 무게가 최대 하중보다 크다면
						queue.offer(0);
						time++;
					
					} else { //최대하중보다 작다면
						queue.offer(truck[i]);
						time++;
						weight += truck[i];
						break ;

					}
				}
			}
		}
		System.out.println(time+W);

	}// end of main
}