백준 4949번 균형잡힌 세상 (C#)

김보근·2025년 6월 30일

백준

목록 보기
39/62

백준 4949번 균형잡힌 세상 (C#)


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

오늘은 백준 4949번 문제인 "균형잡힌 세상" 문제를 풀어봤다.
이 문제는 괄호 문자열이 균형을 이루는지 판단하는 문제다.

괄호는 () 와 [] 두 종류가 있고, 열리는 괄호와 닫히는 괄호가 잘 짝지어져 있어야 한다.
프로그래밍에서는 스택(Stack) 구조를 활용해서 괄호 짝을 맞추는 문제를 자주 접하게 되는데, 이 문제도 그 중 하나였다.

📌 문제 요약

여러 줄의 문장이 주어지는데, 각 줄이 올바른 괄호 문자열인지 판단하는 문제다.
괄호만 신경 쓰면 되고, 다른 문자들은 무시해도 된다.

입력 예시

So when I die (the [first] I will see in (heaven) is a score list).
[ first in ] ( first out ).
Half Moon tonight (At least it is better than no Moon at all].
.

출력 예시

yes
yes
no

🔍 해결 방법

이 문제는 괄호를 스택에 넣었다 뺐다 하면서 짝이 맞는지를 확인하는 구조로 풀 수 있다.

알고리즘 흐름

  1. 한 줄씩 입력을 받는다.

  2. 괄호 (, [는 스택에 push.

  3. 닫는 괄호 )나 ]를 만나면:

    • 스택이 비어있으면 → 짝이 없는 것이므로 no

    • 스택의 top이 짝이 맞는 여는 괄호인지 확인

      	맞으면 pop
      
      	아니면 no
  4. 한 줄을 다 확인한 뒤 스택에 뭔가 남아있다면 → 여는 괄호가 닫히지 않은 것이므로 no

💻 C코드

using System;
using System.Collections.Generic;

namespace Baekjoon
{
    class Program
    {
        static void Main()
        {
            while (true)
            {
                string line = Console.ReadLine();
                if (line == ".") break;

                Stack<char> stack = new Stack<char>();
                bool isBalanced = true;

                foreach (char ch in line)
                {
                    if (ch == '(' || ch == '[')
                    {
                        stack.Push(ch);
                    }
                    else if (ch == ')')
                    {
                        if (stack.Count == 0 || stack.Peek() != '(')
                        {
                            isBalanced = false;
                            break;
                        }
                        stack.Pop();
                    }
                    else if (ch == ']')
                    {
                        if (stack.Count == 0 || stack.Peek() != '[')
                        {
                            isBalanced = false;
                            break;
                        }
                        stack.Pop();
                    }
                }

                if (stack.Count != 0)
                    isBalanced = false;

                Console.WriteLine(isBalanced ? "yes" : "no");
            }
        }
    }
}

🧠 이번에 새로 알게 된 것들

  • Stack.Push(item) → 스택에 아이템 추가

  • Stack.Pop() → 맨 위에 있는 아이템 꺼내기

  • Stack.Peek() → 맨 위 아이템을 꺼내지 않고 확인

  • Stack.Count → 현재 스택에 몇 개 들어있는지

스택이 비어있으면 Count == 0을 활용해서 조건 처리할 수 있다.

✍️ 느낀 점

괄호 문제는 이전에도 많이 봤지만, 이렇게 문자열 전체에서 여러 종류의 괄호를 동시에 다뤄보는 건 처음이었다.
처음엔 조금 헷갈렸지만, 스택 구조만 정확히 이해하고 나면 생각보다 간단했다.

문제를 푸는 도중 Peek()과 Count의 역할을 명확히 알게 된 것도 큰 수확이었다.
앞으로 괄호 관련 문제에서는 자연스럽게 스택을 떠올릴 수 있을 것 같다.

profile
게임개발자꿈나무

0개의 댓글