본문 바로가기

알고리즘 공부/백준 > Python3

[백준 파이썬] #9012: 괄호

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

 

9012번: 괄호

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

www.acmicpc.net

 

[문제 이해]

괄호 문자열(Parenthesis String, PS): 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열

올바른 괄호 문자열(Valid PS, VPS) : 괄호의 모양이 바르게 구성된 문자열

ex) “(())()”,  “((()))” → VPS O / “(()(”, “(())()))” , “(()” → VPS X

 

[풀이 생각]

스택을 이용한 괄호 문제는 자료구조 시간에 배운 문제여서 생각을 쉽게 할 수 있었다.

- '(' 인 경우 스택에 push해준다. ')' 인 경우 스택에서 pop해준다.

- 만약 스택에 아무것도 들어있지 않은데 pop해야 하는 경우가 있다면 올바른 괄호 문자열이 아니다. ex) “())”

- 만약 괄호 비교를 마친 후에도 스택에 '('가 남아있다면 올바른 괄호 문자열이 아니다. ex) “()(”

 

 

[정답]

 

1. 테스트 데이터의 개수 T를 입력받는다.

2. 0~T-1동안 for문을 돌면서 VPS여부를 확인한다.

3. 스택 word_stack와 스택의 VPS여부를 확인할 ans을 정의한다.

4. 괄호 테스트 데이터 word를 입력받는다.

5. 0~len(word)-1동안 for문을 돌면서 만약 괄호가 '('라면 스택에 push해준다. 만약 괄호가 ')'라면 먼저 word_stack에 요소 여부를 확인하고 요소가 없다면 ans=1하고 break한다. word_stack에 요소가 있다면 스택에서 pop한다.

6. 최종적으로 ans==1(스택에 아무것도 들어있지 않은데 pop해야 하는 경우) 와 len(word_stack)>0(괄호 비교를 마친 후에도 스택에 '('가 남아있는 경우) 라면 'NO'를 출력한다. 이 경우에 해당하지 않는 경우에는 'YES'를 출력한다.