본문 바로가기

알고리즘/백준 문제 풀이

[Python] 4949번 균형잡힌 세상

728x90

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

 

4949번: 균형잡힌 세상

하나 또는 여러줄에 걸쳐서 문자열이 주어진다. 각 문자열은 영문 알파벳, 공백, 소괄호("( )") 대괄호("[ ]")등으로 이루어져 있으며, 길이는 100글자보다 작거나 같다. 각 줄은 마침표(".")로 끝난다

www.acmicpc.net


 

22/08/28

 

 

마찬가지로 클래스 2++ 문제 중 안 푼 문제가 있길래 풀어본 문제이다.

 

전형적인 스택을 사용한 응용문제이며, 괄호 문자열에 대한 개념을 알고 있었으면 더 쉽게 푸는 문제이다.

 


 

접근 방법:

 

 

문제에서 주어진 대로 접근했다.

 

이제 괄호 스택을 하나 만드는데, '(' 나 '['가 나올 때마다 괄호 스택에 차곡차곡 그 괄호들을 넣어준다.

 

마찬가지로, ')' 나 ']'이 나올 때마다 스택 바로 위에 있는 괄호를 빼주는데, 그 괄호가 서로 짝이 맞는 괄호여야만 한다.

 

예를 들어 현재 괄호 스택이 [ '(', '[', '(', '[', '[', '(' ] 순으로 쌓여 있을 때, 맨 처음 ')'가 나오고 그다음 ']', 그다음 ']', 그다음 ')', 그다음 ']', 마지막으로 ')'가 나와야만 옳게 괄호 스택을 없앨 수 있다.

 

만약 그러지 않고 스택 바로 위에 있는 괄호와 짝이 안맞는 괄호가 나온다면, 그건 균형이 안 맞는 문자열인 것이다.

 

이를 토대로 시뮬레이션을 돌리며 문제를 풀었다.

 


이를 토대로 작성 한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 4949번 균형잡힌 세상
# 스택, 자료구조
'''
접근 방법:
실제 스택을 구현
'''
import sys
input = sys.stdin.readline

while True: # 한줄 씩 입력 받음
    string = input().rstrip()
    if string == '.': # 종료 조건이 되는 줄을 입력받으면 종료
        break
    bracelet_stack = []  # 괄호 스택
    possible = True  # 가능한 지 여부를 따지는 플래그
    for char in string:  # 문자열의 문자를 하나씩 돌리면서
        if char == '(' or char == '[':  # 왼쪽 괄호를 만나면 괄호 스택에 그 괄호 추가
            bracelet_stack.append(char)
        elif char == ')' or char == ']': # 오른쪽 괄호를 만나면
            if bracelet_stack == []: # 근데 괄호 스택이 비어있는 상황에서 만나면 불가능
                possible = False
                break
            if bracelet_stack[-1] == '(' and char == ')': # 짝이 맞으면 빼준다
                bracelet_stack.pop()
            elif bracelet_stack[-1] == '[' and char == ']': # 짝이 맞으면 빼준다
                bracelet_stack.pop()
            else: # 짝이 안맞는 경우면 불가능
                possible = False
                break
    if bracelet_stack == [] and possible: # 결국 최종 괄호 스택은 비어있어야 됨
        print('yes')
    else:
        print('no')

'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글

[Python] 1697번 숨바꼭질  (0) 2022.09.01
[Python] 18111번 마인크래프트  (0) 2022.08.31
[Python] 2805번 나무 자르기  (0) 2022.08.30
[Python] 1874번 스택 수열  (0) 2022.08.30
[Python] 3533번 Explicit Formula  (0) 2022.08.28