BOJ_9012 괄호
- TOC {:toc}
이 글은 백준 온라인 저지의 9012번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.
일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.
2021.04.24
메모리 | 시간 | 코드 길이 |
---|---|---|
28776 KB | 68 ms | 287 B |
단계 | 시작 시각 | 끝난 시각 | 걸린 시간 |
---|---|---|---|
코딩 | 17:23:32 | 17:26:53 | |
디버깅 | 17:29:45 | 17:42:21 |
import sys
input = sys.stdin.readline
for _ in range(int(input())):
p = []
for i in input().rstrip():
# 입력한 각 괄호에 대해서 괄호가 `(` 이면 이를 `p`에 추가한다.
if i == "(":
p.append(i)
# 괄호가 `)`이면 `p`에 `(`가 들어있는지 확인한다.
# `(`가 없으면 `p`에 원소가 존재하지 않는다는 점을 이용해 확인한다.
elif not p:
p.append(i)
# `(`가 존재하지 않으면 VPS가 될 수 없기 때문에 `break` 해준다.
break
# `(`가 존재하면
else:
# 그 `(`를 `pop` 해준다.
p.pop()
print("YES" if not p else "NO")
디버그
- 왼쪽 괄호 없이 오른쪽 괄호가 나오는 경우를 고려해주어야 한다.
- 오른쪽 괄호가 나왔을 때 무조건
pop()
을 하면 빈 리스트에서pop()
을 해서 에러가 발생할 수 있다.
- 오른쪽 괄호가 나왔을 때 무조건
p
의 원소가 없어서break
할 때)
를 추가하지 않으면p
의 원소가 없는 상태로 종료되기 때문에 YES가 출력된다.- 입력받은 괄호 끝에
\n
이 포함되어있어 VPS인 경우에도p
안에 원소가 있는 경우로 분류되므로input()
에 반드시rstrip()
처리를 해주어야 한다.
피드백
pop()
때문에p
를 리스트로 관리했는데 문자열로 관리하고replace()
나slice()
를 이용하는 게 나을 수도 있었을 것 같다.- 간단하게 값으로 관리할 수도 있다.
(
이면 +1,)
이면 -1을 더해서 결괏값이 0이 나오면 된다.
참고 답안 1
import sys
input = sys.stdin.readline
for T in range(int(input())):
p = input().strip()
# () 쌍으로 없애기 때문에 전체 길이의 1/2만큼만 순회하면 된다.
for i in range(len(p) // 2):
inp = p.replace("()", "")
print("YES" if len(p) == 0 else "NO")
참고 답안 2
from sys import stdin
input() = stdin.readline
n = int(input())
for _ in range(n):
s= 0
for chr in input().strip():
if chr == "(":
# ( 이면 1을 더한다.
s += 1
else:
# ) 이면 1을 뺀다.
s -= 1
# )이 (보다 많이 나오면 VPS가 될 수 없기 때문에
# s가 0보다 작아지면 break 한다.
if s < 0:
break
print("YES" if s == 0 else "NO")
-
ps-python