1. 문제

13335번: 트럭

2. 개요

트럭들과 다리가 있다.

트럭들의 수, 각각의 무게, 다리의 최대 하중과 다리를 건너는데 걸리는 시간이 주어질 때,

모든 트럭이 순서대로 다리를 건널 때 까지의 시간을 구하는 큐 활용 문제.

3. 코드 및 추가내용

import sys
from collections import deque

n, w, L = map(int, sys.stdin.readline().split())

trucks = list(map(int, sys.stdin.readline().split()))
bridge = deque([0 for i in range(w)])
bridge_l = 0
t = 0

for truck in trucks:
    while True:
        bridge_l -= bridge.popleft()

        if bridge_l + truck > L:
            bridge.append(0)
            t += 1

        else:
            bridge.append(truck)
            bridge_l += truck
            t += 1
            break

print(t+w)
using System;
using System.Collections.Generic;

namespace BOJ_
{
	internal class Program
	{
		static void Main(string[] args)
		{
			string[] input = Console.ReadLine().Split();
			int n = int.Parse(input[0]);
			int w = int.Parse(input[1]);
			int L = int.Parse(input[2]);

			int[] trucks = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

			Queue<int> bridge = new Queue<int>(new int[w]);
			int bridge_l = 0;
			int t = 0;

			foreach (int truck in trucks)
			{
				while (true)
				{
					bridge_l -= bridge.Dequeue();

					if (bridge_l + truck > L)
					{
						bridge.Enqueue(0);
						t++;
					}

					else
					{
						bridge.Enqueue(truck);
						bridge_l += truck;
						t++;
						break;
					}
				}
			}

			Console.WriteLine(t+w);
		}
	}
}

다리의 상황을 큐로 만들어둔다.

트럭의 무게를 순서대로 탐색하며 다리의 현재 하중 + 지나야 할 트럭의 무게가 최대하중보다 크다면 다음 트럭이 올라오더라도 버틸 수 있는 하중이 될 때까지 dequeue와 enqueue(0)을 반복하고 그렇지 않다면 dequeue한 후 enqueue(truck)으로 트럭을 다리 위에 올린다.

모든 트럭에 대해 작업을 행했다면, 마지막 트럭이 다리 위에 막 올라온 상황이 되므로 현재까지 걸린 시간 + 마지막 트럭이 다리를 완전히 건널 때까지 걸리는 시간을 출력한다.

Comments