jyamethyst21 님의 블로그
백준 4949번- '균형잡힌 세상' (PYTHON 풀이) 본문
문제:

문제는 어제와 비슷하다. 괄호를 열고 닫는 과정이 정상적이면 yes 그게 아니면 no를 출력하면 된다.
어제 문제는 소괄호만 대상이었어서 좀 더 간단하게 풀었지만, 오늘은 대괄호까지 포함이라 좀 더 생각해야하고 좀 더 코드가 길다.
두 종류의 괄호를 판별하기 위해서 오늘은 pop()을 사용했다. 아래 풀이로 바로 넘어가겠다.
풀이:
while True:
A = input()
if A == '.':
break
stack = []
check = True
for i in A:
if i in '([':
stack.append(i)
elif i == ')':
if not stack or stack[-1] != '(':
check = False
break
stack.pop()
elif i == ']':
if not stack or stack[-1] != '[':
check = False
break
stack.pop()
if check and not stack:
print('yes')
else:
print('no')
우선 문제를 보면 '.' 을 입력할 경우 종료되어야 한다는 종료 조건이 있다. 이걸 보는 순간 while이 쓰고 싶어졌다. 그래서 while안에 값을 입력받고 해당 값이 '.'이면 break를 통해 반복문을 탈출할 수 있게 조건을 먼저 넣어주었다.
그 후 스택 역할을 할 리스트와 정상적으로 괄호가 존재하는지 아닌지를 판별해주는 check bool 변수도 선언해주었다.
어제 문제에서 말했던 것처럼, 반드시 여는 괄호가 있으면 닫히는 괄호가 순서대로 있어야 한다. 어제는 하나의 종류만 판별했기 때문에 간단하게 +,- 과정을 통해 해결했지만 오늘은 그게 아니기 때문에 스택 역할을 할 리스트를 선언해줬다. 그리고 반복문을 돌면서 입력받은 문장의 각 자리를 비교해가면서 여는 괄호일 경우는 그대로 스택에 추가하고 닫히는 괄호일 경우는 스택이 비어있거나(여는 괄호가 없기 때문에 잘못된 문자이므로 no 출력해야됨), 마지막 자리의 글자가 여는 괄호가 아닐 경우에는 check를 False로 변경해주고 반복문을 탈출한다. 그 후 while 마지막 부분의 if문을 통해 check가 False이므로 잘못된 괄호가 포함된 문장으로 판별하여 no가 출력된다.
stack.pop()의 역할은 마지막 자리의 글자를 삭제해주는 역할을 한다. 앞서 말한것처럼 정상인지 비정상인지 판별해주는 if문에서 정상이라고 판단하는 조건은 check가 True이거나 stack이 비어있어야 한다. 그러므로 정상이라고 판별되면 리스트에 값들을 쌓지 않고 바로바로 삭제해주는 과정을 통해 다음 글자를 하나씩 검사한다.
처음에는 전부 쌓아야 한다고 생각해서 복잡해지고 시간이 오래 걸렸는데 오히려 비어내는 쪽으로 방향을 바꾸니 한결 쉬워졌다. 코드 자체에서 어려운 문법은 없기 때문에 이쯤에서 마무리하도록 하겠다.
'CODING 💻' 카테고리의 다른 글
| 백준 2164번- '카드2' (PYTHON 풀이) (0) | 2025.10.25 |
|---|---|
| 백준 18258번- '큐 2' (PYTHON 풀이) (3) | 2025.10.24 |
| 백준 9012번- '괄호' (PYTHON 풀이) (0) | 2025.10.22 |
| 백준 10773번- '제로' (PYTHON 풀이) (0) | 2025.10.21 |
| 백준 28278번- '스택 2' (PYTHON 풀이) (0) | 2025.10.20 |
