SMALL

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


  • 문제


  • 문제풀이

트럭을 줄세우는 큐와 다리 큐를 만들어준다. 다리 위에는 0을 채워넣고 대기줄의 첫번째 트럭의 무게와 다리위에 놓여진 무게의 합이 무게하중 L보다 작거나 같다면 대기줄의 트럭을 다리큐에 옮겨준다. 만약 다리 큐의 개수가 w를 넘어간다면 Dequeue로 한개를 제거해준다. 반대로 무게의 합이 L보다 크다면 먼저 맨앞을 Dequeue해주고 다시한번 체크를 하여 L보다 작다면 트럭을 넣어주고 그렇지 않다면 0을 넣어준다. 마찬가지로 다리 큐의 수가 w를 넘어간다면 Dequeue를 해준다. 만약 마지막 트럭이 다리 위에 올라간다면 while문을 break해주고 시간에 다리의 칸수만큼 더해 출력해준다.

 

예제 입력 1

결과

예제입력 2

결과

예제입력 3

결과

 


  • 코드 1
using System.Text;

namespace yongyong2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            Queue<int> bridge = new Queue<int>();
            Queue<int> waiting = new Queue<int>();
            
            string[] input = Console.ReadLine().Split();
            int n = int.Parse(input[0]);
            int w = int.Parse(input[1]);
            int L = int.Parse(input[2]);
            //int[] arr = new int[10000]; 확인용
            int time = 0;
            string[] weight = Console.ReadLine().Split();
            for(int i = 0; i < weight.Length; i++)
            {
                waiting.Enqueue(int.Parse(weight[i]));//줄 세워 놓음
            }
            for(int i=0; i<w; i++)
            {
                bridge.Enqueue(0);//다리위를 0으로 채움
            }
            while (true)
            {
                time++;
                if(waiting.Peek()+bridge.Sum()<=L)
                {
                    bridge.Enqueue(waiting.Dequeue());
                    if(bridge.Count()>w)
                    {
                        bridge.Dequeue();
                    }
                }
                else if (waiting.Peek() + bridge.Sum() > L)
                {
                    bridge.Dequeue();
                    if (bridge.Sum() + waiting.Peek() <= L)
                    {
                        bridge.Enqueue(waiting.Dequeue());
                    }
                    else
                    {
                        bridge.Enqueue(0);
                    }
                    if (bridge.Count() > w)
                    {
                        bridge.Dequeue();
                    }
                }
                /*for(int i=0;i<bridge.Count();i++)
                {
                    arr=bridge.ToArray();
                    Console.Write(arr[i]);
                }
                Console.WriteLine();*/ //다리에 올라간거 확인작업
             
                if (!waiting.Any())
                {
                    break;
                }
                
            }
            Console.WriteLine(time+w);//마지막 차가 올라가면 거리만큼 더해주기
            
        }
    }
}

  • 후기

왜 처음에 이걸 스택으로 풀려고 했을까

LIST

'백준 > C#' 카테고리의 다른 글

[C#]백준 1929번: 소수 구하기  (0) 2023.02.04
[C#]백준 1978번: 소수 찾기  (0) 2023.02.04
[C#]백준 1874번: 스택 수열  (0) 2023.02.01
[C#]백준 2493번: 탑  (0) 2023.02.01
[C#]백준 17827번: 달팽이 리스트  (0) 2023.01.28

+ Recent posts