본문 바로가기
Development/Baekjoon

[C#] 9012번: 괄호

by Mobics 2025. 11. 16.

목차


    백준 단계별로 풀어보기

    25.11.16

    16단계: 스택, 큐, 덱 1


    9012번: 괄호

    문제 링크 : https://www.acmicpc.net/problem/9012

     

    문제를 풀기 위해 알아야 할 개념

    >> Stack

    : 아래 글에 정리해두었다.

     

     

    자료구조

    목차Stack: Last In First Out (LIFO) 원칙을 따르는 자료구조 >> 주요 메서드Push(x) : 주어진 요소 x를 Stack의 맨 위에 추가한다.Pop() : Stack이 비어있지 않으면 맨 위에 있는 요소를 삭제하고 반환한다.Peek()

    mobics.tistory.com

     

    문제 풀이

    : 괄호의 모양이 바르게 구성되어있는지 확인하려면 '(' 마다 Stack에 추가하고, '(' 뒤에 나오는 ')' 마다 마지막으로 추가한 '(' 를 빼는 과정을 반복했을 때, 최종적으로 Stack에 남아있는 괄호가 없으면 VPS이다. 이때, Stack에 '(' 가 없을 때 ')' 가 나오면 무조건 VPS일 수 없다.

    1. StreamReader로 입력값을 받아 int값으로 변환하여 테스트 데이터의 수를 담을 변수 t 에 담고, '('를 담을 char 형 Stack stack 을 초기화한다.
    2. for 반복문을 통해 아래 과정을 반복하여 입력값이 VPS인지 판단한다.
      •     Stack 에 든 값을 초기화한 다음, StreamReader로 입력값을 받아 input 에 담고 Stack에 '(' 가 없을 때 ')' 가 나왔는지 확인하기 위한 bool 값 needCheck 를 true로 초기화한다.
      •     foreach 문을 통해 입력받은 input 의 괄호를 순회하며 '(' 라면 괄호를 Push 하여 Stack 에 담고 continue 한다. ')' 라면 Stack의 개수를 파악하여 0개라면 needCheck 를 false로 초기화하고 break, 아니라면 Pop 하여 Stack에 있는 '(' 를 뺀다.
      •     foreach 문이 끝났을 때 삼항연산자를 통해 needCheck 가 true이고 Stack의 개수가 0이라면 "YES"를, 아니라면 "NO"를 StringBuilder에 담는다.
    3. StreamWriter로 StringBuilder에 담은 값을 출력한다.

     

    정답 코드

    using System.IO;
    using System.Text;
    
    class Backjoon
    {
        static void Main(string[] args)
        {
            using var sr = new StreamReader(Console.OpenStandardInput());
            using var sw = new StreamWriter(Console.OpenStandardOutput());
            StringBuilder sb = new StringBuilder();
    
            int t = int.Parse(sr.ReadLine());
            
            Stack<char> stack = new Stack<char>();
    
            for (int i = 0; i < t; i++)
            {
                stack.Clear();
                string input = sr.ReadLine();
                bool needCheck = true;
    
                foreach (char c in input)
                {
                    if (c == '(')
                    {
                        stack.Push(c);
                        continue;
                    }
                    
                    if (stack.Count == 0)
                    {
                        needCheck = false;
                        break;
                    }
                        
                    stack.Pop();
                }
    
                sb.AppendLine(needCheck && stack.Count == 0 ? "YES" : "NO");
            }
            sw.Write(sb.ToString());
        }
    }

    'Development > Baekjoon' 카테고리의 다른 글

    [C#] 12789번: 도키도키 간식드리미  (0) 2025.11.18
    [C#] 4949번: 균형잡힌 세상  (0) 2025.11.17
    [C#] 10773번: 제로  (0) 2025.11.15
    [C#] 28278번: 스택 2  (0) 2025.11.14
    [C#] 13909번: 창문 닫기  (0) 2025.11.13