알고리즘 풀이

[C#] 백준 1874번 풀이

bimtaeur30 2025. 10. 16. 08:53

안녕하세요.

오늘은 백준 1874 '스택수열' 문제를 풀이해보겠습니다.

해당 문제는 게임 개발을 할 때 정말 중요한 개념중 하나인 스택을 이용하여 해결하는 문제입니다.

 

저는 해당 문제를 현재 푸시 할 변수를 만들어놓고 테스트 케이스만큼 돌리는 for문 안에서 현재 푸시할 변수가 입력으로 들어온 (스택에서 구해야 할 수)수보다 작을때동안 반복되는 while문으로 stack에 현재 푸시할 변수를 1씩 올리며 Push했습니다.
그 후에 if문으로 stack의 Peek()가 입력된 수와 같고 stack의 Count가 0이 아닌지 검사하여 스택의 수를 Pop했습니다.

만약 if문을 통과하지 못했다면 else문으로 NO를 출력하고 즉시 프로그램을 종료시켰습니다.
Push하고 Pop할때마다 StringBuilder에 각각 +, - 문자열을 더하여 for문이 끝난 후 마지막에 한번에 출력해주었습니다.

 

이제 문제 풀이를 시작해보겠습니다.

입력 예제은 다음과 같이 주어집니다.

8
4
3
6
8
7
5
2
1

 

출력 예제는 다음과 같이 주어집니다.

+
+
+
+
-
-
+
+
-
+
+
-
-
-
-
-

 

저는 먼저 테스트케이스 n을 입력으로 받아왔습니다.

그 후에 StringBuilder sb와 Stack stack을 선언해주었습니다.

internal class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine()!);

        Stack<int> stack = new Stack<int>();
        StringBuilder sb = new StringBuilder();

 

이제 테스트케이스인 n만큼 for문을 돌려줍니다.

그리고 찾을 숫자 하나를 입력받습니다.

다음줄에서 while문으로 찾으려는 숫자가 현재 푸시할 변수보다 같거나 클동안 푸시할 변수를 1씩 더해갑니다.

        for (int  i = 0; i < n; i++)
        {
            int inputNum = int.Parse(Console.ReadLine()!);
            while (currentPush <= inputNum)
            {
                stack.Push(currentPush);
                sb.AppendLine("+");
                currentPush++;
            }

 

while 문 아래 if문에서 inputNum과 stack.Peek()가 같은지를 검사합니다.

참이라면 stack에서 Pop()을 해주고, 아니라면 NO를 출력하고 프로그램을 종료시킵니다.

마지막으로, for문이 끝나면 sb를 한번에 출력합니다.

                if (stack.Count > 0 && inputNum == stack.Peek())
                {
                    int popNum = stack.Pop();
                    sb.AppendLine("-");
                }
                else
                {
                    Console.WriteLine("NO");
                    return;
                }

            }

            Console.WriteLine(sb.ToString());
        }

 

해당 문제의 코드는 여기까지입니다.

읽어주셔서 감사합니다.

다음은 전체코드입니다.

internal class Program
{
    static void Main(string[] args)
    {
        int n = int.Parse(Console.ReadLine()!);

        Stack<int> stack = new Stack<int>();
        StringBuilder sb = new StringBuilder();

        int currentPush = 1;

        for (int  i = 0; i < n; i++)
        {
            int inputNum = int.Parse(Console.ReadLine()!);
            while (currentPush <= inputNum)
            {
                stack.Push(currentPush);
                sb.AppendLine("+");
                currentPush++;
            }

            if (stack.Count > 0 && inputNum == stack.Peek())
            {
                int popNum = stack.Pop();
                sb.AppendLine("-");
            }
            else
            {
                Console.WriteLine("NO");
                return;
            }

        }

        Console.WriteLine(sb.ToString());
    }
}

'알고리즘 풀이' 카테고리의 다른 글

[C#] 백준 28702번 문제풀이  (0) 2025.10.19
[C#] 백준 2108번 문제풀이  (0) 2025.10.18
[C#] 백준 1966번 문제풀이  (0) 2025.10.12
[C#] 백준 1764번 문제풀이  (2) 2025.08.13
[C#] 백준 2920번 문제풀이  (1) 2025.08.11