문제
괄호 문자열은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다.
한 쌍의 괄호 기호로 입력으로 주어진 괄호 문자열이 괄호의 모양이 바르게 구성된 올바른 괄호 문자열인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.
입력
입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다.
각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다.
하나의 괄호 문자열의 길이는 2 이상 50 이하이다.
출력
만일 입력 괄호 문자열이 올바른 괄호 문자열이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.
예제 입력
6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(
예제 출력
NO
NO
YES
NO
YES
NO
풀이
프로그래머스에도 비슷한 문제가 있다.
그때는 아래처럼 살짝 야매식으로 풀었는데 통과가 됐었다.
def solution(s):
if s[0] == ")":
answer = "NO"
elif s[-1] == "(":
answer = "NO"
elif s[-3:] == "(()":
answer = "NO"
elif s[:2] == "())":
answer = "NO"
elif s.count("(") != s.count(")"):
answer = "NO"
else:
answer = "YES"
return print(answer)
T = int(input())
for _ in range(T):
solution(input())
별다른 로직이 있는건 아니고 시작부터 틀린 것 혹은 마지막이 잘못된 것 인지 아닌지를 판별하고 또 짝이 다 맞는지 갯수 확인만 하는 방법이었는데 백준에서는 통하지 않았다 ㅋㅋ
결국 반복문을 통해서 괄호들을 제거해주는 방식으로 문제를 풀어야겠다는 생각이 들긴 했는데 while문보단 for문이 익숙한지라 for문만으로 해결해보려고 여러차례 시도했지만 실패했다.
def remove(t1):
a = []
for i in range(len(t1)):
try:
if i == 0:
a.append(t1[i])
else:
if t1[i-1] == "(" and t1[i] == ")":
a.pop()
else:
a.append(t1[i])
except:
pass
t1 = a
return t1
T = int(input())
for _ in range(T):
t2 = input()
while len(t2) > 0:
first = len(t2)
t2 = remove(t2)
last = len(t2)
if first == last:
break
if len(t2) == 0:
print("YES")
else:
print("NO")
for 문을 통해서 한바퀴 돌면서 괄호를 제거해주는 함수를 정의해주고 while문으로 이 함수를 반복적으로 사용하되 만약 함수를 사용하기 전과 후의 총 글자수가 변함이 없다면 제거된 괄호가 없다는 뜻이므로 반복문이 멈추도록 조건을 주었다.
그렇게 정제된 문장이 괄호가 모두 제거되어 0글자면 YES를, 남은 괄호가 있다면 NO를 출력하도록 했다.
'알고리즘&자료구조 > 백준' 카테고리의 다른 글
9093 - 단어 뒤집기 (0) | 2021.10.08 |
---|