
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
이 문제는 괄호를 스택에 넣었다 뺐다 하면서 짝이 맞는지를 확인하는 구조로 풀 수 있다.
알고리즘 흐름
한 줄씩 입력을 받는다.
괄호 (, [는 스택에 push.
닫는 괄호 )나 ]를 만나면:
스택이 비어있으면 → 짝이 없는 것이므로 no
스택의 top이 짝이 맞는 여는 괄호인지 확인
맞으면 pop
아니면 no
한 줄을 다 확인한 뒤 스택에 뭔가 남아있다면 → 여는 괄호가 닫히지 않은 것이므로 no
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의 역할을 명확히 알게 된 것도 큰 수확이었다.
앞으로 괄호 관련 문제에서는 자연스럽게 스택을 떠올릴 수 있을 것 같다.