괄호
아이디어
- 여는 괄호
(
닫는 괄호)
가 순서와 짝이 맞아야한다. - 닫는 괄호보다 여는 괄호가 먼저 나와야한다.
- 여는 괄호를 스택에 푸시하고 닫는 괄호가 나오면 팝하여 지워나가서 입력받은 괄호 문자열을 모두 검사하였을 경우 스택이 비어있으면 YES를 출력한다.
정답코드
num = int(input())
for i in range(num):
stack = []
s = input()
check = True
for char in s:
if char == "(":
stack.append(char)
else:
if not stack:
print("NO")
check = False
break
stack.pop()
if check == True: # 체크 변수를 넣어준 이유 : 위에 포문에서 닫이는 괄호가 나왔는데 스택이 비어있는경우 노를 프린트하고 밑으로 내려와서 스택이 비어있으면 예스를 한번 더 출력하기 때문
if not stack:
print("YES")
else:
print("NO")
시행착오
처음에 check 변수
를 안두고 풀었더니 for문안에서 스택이 비어서 NO를 출력하고 브레이크에 걸려 for문을 나와 스택이 비어있는 상태라 YES를 한번 더 출력하는 오류가 발생하였다.
예를 들어 입력값이())
의 경우 for문의 과정을 보면
문자열 | ( | ) | ) |
---|---|---|---|
스택 | ( | empty | break |
닫는괄호가 남았지만 스택은 비어있어 브레이크에 걸려 No를 출력하고 | |||
for문에서 빠져나온후 다시 YES를 출력하는 오류를 발견하게 되었다. |
그래서 check변수를 두어 for문안에서 break가 걸리는 상황일 경우 check변수를 False로
만들어준후 for문 을 나왔을 경우 체크를 하게 해서 오류를 잡게 되었다.
배운것
check 변수를 두고 푼다음 찾아보니 for-else
를 사용하는 방법도 알게 되었다.
for문을 break없이 통과한다면 else로 들어가는 문법이다.
for i in range(3):
if i == 1:
print ('브레이크')
break
else:
print ('끝')
위 예제의 경우는 i = 1 에서 루프를 빠져나오기때문에, else문이 실행이 되지 않아
'끝' 이 출력이 안되고,
for i in range(3):
# nop
pass
else:
print ('끝')
위와 같은 경우는 , for문이 break없이 빠져나왔으므로 '끝' 이 출력이 된다.
'항해99 chap02' 카테고리의 다른 글
카드2 - 큐 (0) | 2022.01.21 |
---|---|
스택 수열 - 스택 (0) | 2022.01.21 |
중복 문자 제거 - 스택 (0) | 2022.01.21 |
일일온도 - 스택 (0) | 2022.01.21 |
홀짝 연결 리스트 (0) | 2022.01.18 |