BOJ

[BOJ] 4949. 균형잡힌 세상

rubato.dev 2025. 7. 21. 13:14

📌 문제 제목

문제 링크: BOJ 4949

🗒️ 문제 설명

어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단하는 프로그램

괄호는 소괄호와 대괄호로 되어있고, 문자열이 균형을 이루는 조건은 아래와 같다.

  • 모든 왼쪽 소괄호는 오른쪽 소괄호와만 짝을 이루어야 한다.
  • 모든 왼쪽 대괄호는 오른쪽 대괄호와만 짝을 이루어야 한다.
  • 모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.
  • 모든 괄호들의 짝은 1:1 매칭만 가능하다. 즉, 괄호 하나가 둘 이상의 괄호와 짝지어지지 않는다.
  • 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.

문자열이 주어졌을 때 균형을 이루고 있으면 "yes", 아니면 "no"를 출력

온점 하나 (".")만 입력되면 입력이 종료된다.

시간 제한: 1초

메모리 제한: 128MB

문장의 길이는 100글자보다 작거나 같다.


💡 문제 해결 아이디어

  • 문장을 순회하며 여는 괄호일 때는 스택에 추가, 닫는 괄호는 스택의 마지막 원소와 비교
  • 닫는 괄호 입력 시 스택에 원소가 있는지 확인 + 스택의 마지막 원소가 대칭되는지 확인
  • 순회가 끝나고 스택에 원소가 남아있는지 확인

⌛️ 시간 복잡도

  • O(N)

✅ 최종 코드

import sys
input = sys.stdin.readline

while True:
    # rstrip인 이유: 입력에 공백 + 온점과 그냥 온점은 다른 문장임. strip 사용 시 두 입력이 같다고 판별
    sentence = input().rstrip()

    if sentence == '.':
        break

    stk = []
    flag = True
    for s in sentence:
        if s == '(' or s == '[':
            stk.append(s)
        elif s == ')':
            if not stk or stk[-1] != '(':
                flag = False
                break
            stk.pop()
        elif s == ']':
            if not stk or stk[-1] != '[':
                flag = False
                break
            stk.pop()
    if stk:
        flag = False
    print("yes" if flag else "no")