[BAEKJOON] 백준 5464: 주차장 (C#)

2024. 8. 23. 15:16IT/BaekJoon

문제 링크

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

 

 

문제

시내 주차장은 1부터 N까지 번호가 매겨진 N개의 주차 공간을 가지고 있다. 이 주차장은 매일 아침 모든 주차 공간이 비어 있는 상태에서 영업을 시작하며, 하룻동안 다음과 같은 방식으로 운영된다. 차가 주차장에 도착하면, 주차장 관리인이 비어있는 주차 공간이 있는지를 검사한다. 만일 비어있는 공간이 없으면, 차량을 빈 공간이 생길 때까지 입구에서 기다리게 한다. 만일 빈 주차 공간이 하나만 있거나 또는 빈 주차 공간이 없다가 한 대의 차량이 주차장을 떠나면 곧바로 그 장소에 주차를 하게 한다. 만일 빈 주차 공간이 여러 곳이 있으면, 그 중 번호가 가장 작은 주차 공간에 주차하도록 한다. 만일 주차장에 여러 대의 차량이 도착하면, 일단 도착한 순서대로 입구의 대기장소에서 줄을 서서 기다려야 한다. 대기장소는 큐(queue)와 같이, 먼저 대기한 차량부터 주차한다.

주차료는 주차한 시간이 아닌 차량의 무게에 비례하는 방식으로 책정된다. 주차료는 차랑의 무게에다 주차 공간마다 따로 책정된 단위 무게당 요금을 곱한 가격이다.

주차장 관리원은 오늘 M대의 차량이 주차장을 이용할 것이라는 것을 알고 있다. 또한, 차량들이 들어오고 나가는 순서도 알고 있다.

주차 공간별 요금과 차량들의 무게와 출입 순서가 주어질 때, 오늘 하룻동안 주차장이 벌어들일 총 수입을 계산하는 프로그램을 작성하라.

 

입력

반드시 표준 입력으로부터 다음의 데이터를 읽어야 한다.

  • 첫 번째 줄에는 정수 N과 M이 빈칸을 사이에 두고 주어진다.
  • 그 다음 N개의 줄에는 주차 공간들의 단위 무게당 요금을 나타내는 정수들이 주어진다. 그 중 s번째 줄에는 주차 공간 s의 단위 무게당 요금 Rs가 들어있다.
  • 그 다음 M개의 줄에는 차량들의 무게를 나타내는 정수들이 주어진다. 차량들은 1 부터 M 까지 번호로 구분되고, 이 번호는 출입 순서와는 상관없다. 이 M개의 줄 중 k번째 줄에는 차량 k의 무게를 나타내는 정수 Wk가 들어있다.
  • 그 다음 2*M 개의 줄에는 차량들의 주차장 출입 순서를 나타내는 정수들이 한 줄에 하나씩 주어진다. 양의 정수 i는 차량 i가 주차장에 들어오는 것을 의미하고, 음의 정수 -i는 차량 i가 주차장에서 나가는 것을 의미한다. 주차장에 들어오지 않은 차량이 주차장에서 나가는 경우는 없다. 1 번부터 M 번까지 모든 차량은 정확하게 한 번씩 주차장에 들어오고, 한 번씩 주차장에서 나간다. 또한 입구에서 대기 중인 차량이 주차를 하지 못하고 나가는 경우는 없다.
  • 1 ≤ N ≤ 100 주차 공간의 수
  • 1 ≤ M ≤ 2,000 차량의 수
  • 1 ≤ Rs ≤ 100 주차 공간 s의 단위 무게당 요금
  • 1 ≤ Wk ≤ 10,000 차량 k의 무게

 

 

출력

출력은 반드시 표준 출력으로 하여야 하며, 하나의 줄에 한 개의 정수를 출력한다. 이 정수는 오늘 하룻동안 주차장이 벌어들인 총 수입이다.

 

 

 

통과한 답안

namespace _5464
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            int n = int.Parse(inputs[0]);
            int m = int.Parse(inputs[1]);

            int[] prices = new int[n];
            for (int i = 0; i < n; i++)
            {
                prices[i] = int.Parse(Console.ReadLine());
            }

            int[] cars = new int[m + 1];
            for (int i = 0; i < m; i++)
            {
                cars[i + 1] = int.Parse(Console.ReadLine());
            }

            int[] parkingLot = new int[n];
            Queue<int> watingQueue = new Queue<int>();
            int total = 0;

            for (int i = 0; i < 2 * m; i++)
            {
                int carNumber = int.Parse(Console.ReadLine());

                if (carNumber > 0)
                {
                    bool isParked = false;
                    for (int j = 0; j < n; j++)
                    {
                        if (parkingLot[j] == 0)
                        {
                            parkingLot[j] = carNumber;
                            total += prices[j] * cars[carNumber];
                            isParked = true;
                            break;
                        }
                    }

                    if (!isParked)
                    {
                        watingQueue.Enqueue(carNumber);
                    }
                }
                else
                {
                    carNumber = -carNumber;
                    for (int j = 0; j < n; j++)
                    {
                        if (parkingLot[j] == carNumber)
                        {
                            parkingLot[j] = 0;

                            if (watingQueue.Count > 0)
                            {
                                int nextCar = watingQueue.Dequeue();
                                parkingLot[j] = nextCar;
                                total += prices[j] * cars[nextCar];
                            }
                            break;
                        }
                    }
                }
            }

            Console.WriteLine(total);
        }
    }
}

 

주차 공간의 단위 무게당 주차 요금과 각 자동차들의 무게가 주어지고

이 자동차들이 주차장을 이용하는 순서(양수는 입장, 음수는 퇴장)가 주어졌을 때,

이 주차장에서 하루에 벌어들이는 소득을 구하는 문제이다.

 

이 문제에서 특징이라고 할 수 있는 부분은 주차공간이 부족한 경우에는

대기하고 있다가 주차공간이 생기면 그곳에 주차하는 부분이다.

이를 구현하기 위해서 큐를 이용하였다.

 

각각의 입력값들을 입력 받아 저장한 후에

2 * m짜리 길이의 입력 부분에서 계산을 진행하였으며,

현재 주차된 공간과 기다리는 자동차를 계산하기 위해서

parkingLot 배열과 watingQueue 큐를 사용하였다.

 

차량의 숫자를 받은 후에 양수라면 주차를, 음수라면 퇴장을 진행하였는데,

주차의 경우 비어있는 parkingLot가 있다면 해당 위치에 주차하며 요금 계산을

parkingLot가 비어있지 않다면 해당 자동차의 정보를 watingQueue에 저장하였다.

이후에 퇴장의 경우에 watingQueue에 남아 있는 자동차가 있다면

해당 자동차를 퇴장하고 생긴 공간에 주차하며 요금 계산을 하도록 구현하였다.