본문 바로가기
백준 알고리즘/스택

[백준 9012][파이썬] 괄호 문제

by 웅대 2023. 2. 3.
728x90
반응형

https://www.acmicpc.net/problem/9012

 

9012번: 괄호

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고

www.acmicpc.net

괄호 모양이 올바른 괄호 모양인지 판단하는 문제이다.

 

올바른 괄호 모양의 정의를 다음과 같이 내렸다.

 

1. '(' 모양의 개수를 left, ')' 모양의 개수를 right로 정한다.

 

2. 문자열의 앞에서부터 left와 right를 증가시키는 과정에서 left는 항상 right 보다는 같거나 커야한다. 

 

3. 한 문자열을 전부 조사하고 나면 left와 right의 개수는 반드시 같아야 한다.

 

import sys 
n=int(sys.stdin.readline())
for _ in range(n):
    ps=sys.stdin.readline().strip('\n')
    left=0
    right=0
    con=False
    for i in ps:
        if i=='(':
            left+=1
        else:
            right+=1
        if right>left:
            print("NO")
            con=True
            break
    if con:
        continue
    if left==right:
        print("YES")
    else:
        print("NO")

 

나는 이렇게 풀었으나 사실 이 문제의 출제 의도는 스택을 활용한 문제풀이이다.

 

쉬운 문제라 스택을 사용하지 않아도 풀 수 있었으나 스택을 활용하면 문제 풀이에 더욱 적합한 풀이가 된다.

 

1. '(' 문자를 만날 때마다 스택에 문자를 추가한다.

 

2. ')' 문자를 만나면 스택에서 '(' 문자를 제거한다. 제거할 '(' 문자가 없으면 올바르지 않은 괄호 모양이다.

 

3. 한 문자열을 전부 조사하고 나면 스택이 비어있어야 한다.

 

list를 스택처럼 사용해도 되지만 스택에 들어가는 문자는 '(' 문자 하나이기 때문에 그냥 정수형 변수 만들어서 1을 더하고 빼는 식으로 구현하는 편이 쉽다.

 

<스택을 활용한 방식>

import sys 
n=int(sys.stdin.readline())
for _ in range(n):
    ps=sys.stdin.readline().strip('\n')
    stack=0
    con=False
    for i in ps:
        if i=='(':
            stack+=1
        else:
            stack-=1
        if stack<0:
            print("NO")
            con=True
            break
    if con:
        continue
    if stack==0:
        print("YES")
    else:
        print("NO")

 

728x90
반응형

'백준 알고리즘 > 스택' 카테고리의 다른 글

[백준 5430][파이썬] AC  (0) 2023.02.25
[백준 1874][파이썬] 스택 수열  (0) 2023.02.23
[백준 10799][파이썬] 쇠막대기  (0) 2023.02.05

댓글