컴퓨터 공학 분야 별 지식/백준

BOJ 백준 4949번 문제 <균형잡힌 세상> python, 문제 해석 및 풀이

N돌핀 2023. 1. 18. 16:55

뭐 풀다가 고민하다가 문제집에 있던 것 중 이름에 끌려서 도전하게 되었다.

 

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

 

4949번: 균형잡힌 세상

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

www.acmicpc.net


문제에 대한 간단한 이해

- 양쪽 괄호가 짝이 맞는지 확인하는 프로그램을 만들어야 합니다.

입출력에 대한 이해

- 특이하게 테스트 케이스의 갯수를 먼저 알려주지 않고 문장 끝 .을 하나의 문자열로 인식해야 하는 문제입니다.

 

- while(True)로 문자열을 한 줄 씩 받으면서 종료조건인 '.'에 해당하는지 매번 체크해줍니다.

 

- 입력을 한 줄 씩 받아서 각 줄마다 균형이 잡혀있는지 여부를 판단하고 출력을 해줍니다.

문제에 대한 세부 이해

1. 주어진 것(입력값)

문자열 여러 줄

 

2. 구하고자 하는 것(출력값)

균형이 잡혀있는지 여부 yes or no

 

3. 규칙

백준 9012 괄호 문제와 비슷한 느낌으로 문자열 안에 괄호가 잘 짝지어져 있는지 판단하는 게 유일한 규칙입니다.

구현

- 입력받은 문자열 한 줄당 판단을 할 것이니 while(True)를 이용해서 종료조건을 넣은 큰 틀을 잡아줍니다.

 

필요한 작업 나열

- 문자열을 앞에서부터 하나씩 돌면서 괄호와 상관없는 것은 무시, 괄호들은 새로운 빈 문자열(tmp_line)에 저장하여 균형잡힌 문자열인지 확인할 때 사용합니다.

 

- 왼쪽 괄호라면 그냥 추가해주면 되고 오른쪽 괄호가 나왔을 때 그에 맞는 왼쪽 괄호가 나왔는지 새롭게 저장해두는 문자열(tmp_line)의 끝을 확인합니다.

 

- 규칙에 어긋난다면 이번 문장의 판단을 break을 이용해서 끝내고 판단값을 출력합니다.

 

- 규칙에 어긋나지 않지만 문자열들의 짝이 맞지 않는지 확인하기 위해 짝이 맞으면 새롭게 저장되는 문자열(tmp_line)을 지워줍니다. 문자열의 모든 문자를 다 돌고 나서 짝이 맞지 않으면 새롭게 저장되는 문자열(tmp_line)은 빈 문자열이 아니게 됩니다.

import sys

while(True):
    line = sys.stdin.readline()
    if line[0] == '.':
        break
    tmp_line = ''
    yes_bool = True
    for c in line:
        if (c == '(') or (c == '['):
            tmp_line += c
        elif ((c == ')') or (c == ']')) and (tmp_line == ''):
            yes_bool = False
            break
        elif c == ')':
            if tmp_line[-1] != '(':
                yes_bool = False
                break
            else:
                tmp_line = tmp_line[:-1]
        elif c == ']':
            if tmp_line[-1] != '[':
                yes_bool = False
                break
            else:
                tmp_line = tmp_line[:-1]
    if (tmp_line == '') and yes_bool:
        print('yes')
    else:
        print('no')