뭐 풀다가 고민하다가 문제집에 있던 것 중 이름에 끌려서 도전하게 되었다.
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')
'컴퓨터 공학 분야 별 지식 > 백준' 카테고리의 다른 글
BOJ 백준 2559번 문제 <수열> python, 문제 해석 및 풀이 (0) | 2023.02.02 |
---|---|
BOJ 백준 2003번 문제 <수들의 합 2> python, 문제 해석 및 풀이 (0) | 2023.02.01 |
BOJ 백준 1935번 문제 <후위 표기식> python, 문제 해석 및 풀이 (0) | 2023.01.19 |
BOJ 백준 18258번 문제 <큐2> python, 문제 해석 및 풀이 (0) | 2023.01.17 |
BOJ 백준 9012번 문제 <괄호> python, 알고리즘 문제 푸는 방법 (0) | 2023.01.16 |