Python 문제풀이
n = int(input())
result = []
for i in range(n):
text = input()
left=0
right=0
for i in range(len(text)):
if text[i]=='(':
left +=1
else:
right +=1
if left<right:
break
if left==right:
result.append("YES")
else:
result.append("NO")
for i in range(len(result)):
print(result[i])
처음에 이 문제를 푸는데 괄호의 개수가 서로 다르면 NO라고 출력하도록 해놓고 틀렸다는 것을 알게되었습니다.
'))(('의 경우는 괄호의 개수가 같아도 이상한 괄호가 되기 때문입니다.
그 이후에는 정말 복잡하게 문제를 꼬아서 풀고있었습니다.
그러다가 포기하고 싶어지던 무렵.. 다시 괄호의 개수를 사용해보자는 생각이 들었는데, 잘 보니 왼쪽 괄호'(' 가 오른쪽 괄호보다 적어지는 순간은 이상한 괄호문장이라는 것을 깨닳았습니다.
왼쪽괄호 오른쪽 괄호 개수가 같은데 오른쪽이 더 많아지는 순간이 오는 괄호: '()())(' '(()))()('
그리고 괄호의 개수가 다르면 당연히.. 옳지 않은 괄호 문자열입니다.
이것을 활용하여 왼쪽 괄호와 오른쪽 괄호의 개수를 반복문을 통해 세면서 왼쪽 괄호보다 오른쪽 괄호가 많아지는 순간이 생기는 문자열은 반복문을 탈출시킵니다. 이때 상태는 왼쪽괄호보다 오른쪽 괄호가 하나 더 많은 상태이기 때문에 NO가 결과리스트에 추가될 것 입니다.
이 경우가 아니더라도 왼쪽 괄호가 오른쪽괄호의 개수보다 많은경우가 있다면 반복문을 종료한 뒤 NO가 결과리스트에 추가됩니다.
'코딩문제풀이 > 백준' 카테고리의 다른 글
[백준 10828번] 스택 Python 풀이 (0) | 2021.07.07 |
---|---|
[백준 1316번] 그룹 단어 체커 Python 풀이 (0) | 2021.07.07 |
[백준 11721번] 열 개씩 끊어 출력하기 Python 풀이 (0) | 2021.07.07 |
[백준 10804번] 카드 역배치 Python 풀이 (0) | 2021.07.05 |
[백준 10214번] Baseball Python 풀이 (0) | 2021.07.05 |