알고리즘

[백준(BOJ)] 4949번 균형잡힌 세상

욘아리 2024. 1. 9. 23:04

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

 

4949번: 균형잡힌 세상

각 문자열은 마지막 글자를 제외하고 영문 알파벳, 공백, 소괄호("( )"), 대괄호("[ ]")로 이루어져 있으며, 온점(".")으로 끝나고, 길이는 100글자보다 작거나 같다. 입력의 종료조건으로 맨 마지막에

www.acmicpc.net

괄호("()", "[]")들의 균형이 잘 맞춰져 있는지 판단하는 문제다.

예시

Example 1:

Input: 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].
	A rope may form )( a trail in a maze.
	Help( I[m being held prisoner in a fortune cookie factory)].
	([ (([( [ ] ) ( ) (( ))] )) ]).
	 .
	.
Output: yes
	yes
	no
	no
	no
	yes
	yes

풀이

def is_balanced(s):
    opener = '(['
    closer = ')]'
    stack = []

    for char in s:
        if char in opener:
            stack.append(char)
        elif char in closer:
            if not stack:
                return False
            top = stack.pop()
            if opener[closer.index(char)] != top:
                return False

    return not stack


while True:
    sentence = input()
    if sentence == '.':
        break
    res = is_balanced(sentence)
    if res:
        print('yes')
    else:
        print('no')

 

- 문자열에 여는 괄호가 있으면 스택에 추가하고, 닫는 괄호가 있으면 스택 마지막 문자열을 확인 후 같으면 제거한다.

- 문자열을 모두 순회한 후 스택이 비어있지 않다면 괄호가 짝지어져 있지 않으므로 False를 반환한다.

- 사용자로부터 문장을 입력받고, 온점만 있을 경우 루프를 종료한다.