WalkerJei's Lifelog

백준알고리즘 10845번 큐 C# 본문

소프트웨어 개발/코딩테스트(기성 문제)

백준알고리즘 10845번 큐 C#

WalkerJei 2025. 5. 12. 21:03

세부 정보

  • 사이트: 백준알고리즘
  • 번호: 10845
  • 문제명: 큐
  • 언어: C#
  • 분류: 자료 구조, 큐
  • 비고: 

 

문제

정수를 저장하는 큐를 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 여섯 가지이다.

  • push X: 정수 X를 큐에 넣는 연산이다.
  • pop: 큐에서 가장 앞에 있는 정수를 빼고, 그 수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • size: 큐에 들어있는 정수의 개수를 출력한다.
  • empty: 큐가 비어있으면 1, 아니면 0을 출력한다.
  • front: 큐의 가장 앞에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.
  • back: 큐의 가장 뒤에 있는 정수를 출력한다. 만약 큐에 들어있는 정수가 없는 경우에는 -1을 출력한다.

 

입력

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 않은 명령이 주어지는 경우는 없다.

 

출력

출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

 

풀이

문자열 변수에 특정한 문자열이 포함되어 있는 지 확인할 때는 Contains()를 사용하면 된다.

큐는 선입선출 방식이므로 마지막에 입력한 수를 따로 저장해서 맨 뒤의 정수를 구할 수 있다.

using System.Text;

class CommandQueue
{
    public static void Main(string[] args)
    {
        StreamReader sr = new StreamReader(Console.OpenStandardInput());
        StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

        // 결과를 저장할 곳
        StringBuilder sb = new StringBuilder();
        // 입력한 것을 저장할 큐
        Queue<int> queue = new Queue<int>();
        // 입력할 명령의 개수 입력
        int command = Convert.ToInt32(sr.ReadLine());
        // push 명령 입력 시 뒤의 정수가 들어갈 곳
        int lastNum = 0;

        // 명령의 개수가 0으로 줄어들 때까지 반복
        while (command-- > 0)
        {
            // 명령어 입력
            string input = sr.ReadLine();

            // push 입력 시
            if (input.Contains("push"))
            {
                // 뒤따라온 수를 추출해 저장한다.
                lastNum = Convert.ToInt32(input.Split()[1]);
                // 뒤따라온 수를 큐에 삽입한다.
                queue.Enqueue(lastNum);
            }
            // 큐의 맨 앞 정수를 빼고 그 수를 출력한다. 큐가 비었다면 -1 출력
            else if (input == "pop")
                sb.AppendLine(queue.Count > 0 ? queue.Dequeue().ToString() : "-1");
            // 큐에 저장된 정수 개수 출력
            else if (input == "size")
                sb.AppendLine(queue.Count.ToString());
            // 큐가 비어 있다면 1, 아니면 0 출력
            else if (input == "empty")
                sb.AppendLine(queue.Count == 0 ? "1" : "0");
            // 큐의 맨 앞의 정수를 확인하며 없으면 -1 출력
            else if (input == "front")
                sb.AppendLine(queue.Count > 0 ? queue.Peek().ToString() : "-1");
            // 큐의 맨 뒤의 정수를 확인하며 없으면 -1 출력
            else if (input == "back")
                sb.AppendLine(queue.Count > 0 ? lastNum.ToString() : "-1");
        }
        // 명령 실행 결과 출력
        sw.WriteLine(sb);

        sr.Close();
        sw.Close();
    }
}

 

후기

2025.03.29 - [소프트웨어 개발/코딩테스트(기성 문제)] - 백준알고리즘 18258번 큐 2 C#

이전에 한 번 풀어본 적 있는 문제였는데 기억이 잠자고 있었는지 어떻게 풀어야 할 지 기억이 나지 않았다. 아무래도 복습을 할 필요성이 있었다. 또한 언젠가는 C++로도 풀어볼 생각도 있다.

참고로 이 문제는 시간 제한이 이전에 푼 문제보다 절반인 0.5초로 되어 있었다.