코딩코딩코딩

백준(BAEKJOON) 9012 괄호 - 파이썬 본문

파이썬/Algorithms

백준(BAEKJOON) 9012 괄호 - 파이썬

hanshow113 2021. 4. 10. 17:00

 

< 풀이 방법 >

Stack 활용

* Stack은 LIFO(Last In First Out)의 형태를 갖는 자료구조

- Push, Pop 등의 메서드 이용

 

< 접근 방법 >

1. 입력받은 문자열을 앞에서부터 순차적으로 하나씩 접근

    * 문자열은 크게   여는 괄호 "(",  닫는 괄호 ")" ,  기타(문자) 로 이루어져 있음

 

2.

(1) stack을 만들어두고 "("가 나오면 하나씩 push

    - 파이썬에서는 리스트의 append, pop을 활용하면 됨

(2) last_check = 0 이라는 변수를 만들어 둠 --> 마지막에 닫는 괄호 ")" 가 오는 경우 대비

 

3. ")" 가 나왔을 때 스택에서 하나씩 pop함 --> 담아뒀던 여는 괄호 "("가 하나씩 빠짐

  - 예외 상황

    - stack이 비어있는 경우

        - 입력받은 문자열을 순회하는 for문을 break해서 끝냄

    - 마지막에 닫는 괄호 ")" 가 오는 경우

        - 2-(2)에서 만들어 둔 last_check를 변경

 

4. 문자열을 순회하는 for문이 종료된 후

stack이 비어있지 않거나 /  last_check가 처음 만든 0과 동일하지 않으면 "NO"를 출력함

그 외의 경우 "YES" 출력

 

 

< 코드 >

iter_num = int(input())

for each_iter in range(iter_num):
    paranthesis = input()
    stack_list = []
    last_check = 0    # 마지막에 ")"가 오는 경우 대비

    for str_idx in range(len(paranthesis)):
        each_str = paranthesis[str_idx]

        if each_str == "(":
            stack_list.append(each_str)
        elif each_str == ")":
            if not stack_list:    # 리스트 비어있을 경우
                last_check += 1
                break
            else:
                stack_list.pop()
        else:
            continue
    if (len(stack_list) != 0) or last_check != 0:
        print("NO")
    else:
        print("YES")

 

21.12.27일 다시 풀어본 코드

import sys
# vps: Valid Paranthesis String
num = int(sys.stdin.readline())

for _ in range(num):
    target = list(sys.stdin.readline().strip())
    temp = [] # 입력 괄호 문자열 확인용 빈 스택
    # "(" 이면 스택에 추가
    # 스택이 비어있지 않을 때 ")" 이면 스택 pop, 스택이 비어있을 때면 break, not vps
    for x in target:
        if x == "(":
            temp.append(x)
        else:
            if len(temp) == 0:
                temp.append(x)
                break
            else: temp.pop()

    if len(temp) == 0:
        print("YES")
    else: print("NO")
Comments