본문 바로가기

항해99 chap02

괄호 - 스택

괄호

백준 괄호.


아이디어

  1. 여는 괄호 ( 닫는 괄호 )가 순서와 짝이 맞아야한다.
  2. 닫는 괄호보다 여는 괄호가 먼저 나와야한다.
  3. 여는 괄호를 스택에 푸시하고 닫는 괄호가 나오면 팝하여 지워나가서 입력받은 괄호 문자열을 모두 검사하였을 경우 스택이 비어있으면 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