🔔 문제

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

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 128 MB 124445 56604 40959 44.410%

괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 “(())()”와 “((()))” 는 VPS 이지만 “(()(”, “(())()))” , 그리고 “(()” 는 모두 VPS 가 아닌 문자열이다.

여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 주어진다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 괄호 문자열이 한 줄에 주어진다. 하나의 괄호 문자열의 길이는 2 이상 50 이하이다.

출력

출력은 표준 출력을 사용한다. 만일 입력 괄호 문자열이 올바른 괄호 문자열(VPS)이면 “YES”, 아니면 “NO”를 한 줄에 하나씩 차례대로 출력해야 한다.

예제 입력 1

6
(())())
(((()())()
(()())((()))
((()()(()))(((())))()
()()()()(()()())()
(()((())()(

예제 출력 1

NO
NO
YES
NO
YES
NO

예제 입력 2

3
((
))
())(()

예제 출력 2

NO
NO
NO

출처

ICPC > Regionals > Asia Pacific > Korea > Nationwide Internet Competition > Daejeon Nationalwide Internet Competition 2012 G번

  • 데이터를 만든 사람: baekjoon
  • 데이터를 추가한 사람: jh05013
  • 문제의 오타를 찾은 사람: marona

알고리즘 분류


🔐 해결 (소스 코드)

T = int(input())

for _ in range(T):
    stack = []
    str = input()
    # 괄호 판별을 위한 반복문
    for c in str:
        if c == '(':
            stack.append(c)
        elif c == ')':
            # stack에 뭐라도 있는 경우
            if stack:
                stack.pop()
            # stack에 아무것도 없는 경우    
            else:
                print("NO")
                break
            
    # break문이 걸리지 않을 경우를 대비해서 for-else문을 이용해서 한번 더 체크하면서, 최종 결과값인 YES와 NO를 판별
    # for-else문 참고 출처 : https://harryp.tistory.com/317
    else:        
        if len(stack) == 0:
            print("YES")
        else:
            print("NO")     

📝 후기

아무 생각없이 샤워를 하다가 “이 문제를 풀 수 있을 것 같다”는 생각이 들어 즉흥적으로 풀게 되었다.

이번 문제를 풀면서 배울 수 있었던 것은 for-else 문이었다.
(참고한 사이트 링크 : https://harryp.tistory.com/317)

스택 문제니까 ‘스택’스럽게 접근했는데, 아는대로 해보니까 출력 결과값이 원하는대로 출력이 되지 않았다.

그래서, 내가 해놓은 것에서 수월하게 적용할 수 있는 해결 방법을 찾다보니 ‘for-else문’에 대해서 보게 되었고, 그대로 풀이에 적용해보면 좋겠다는 생각이 들어서 적용해봤더니 코드가 잘 동작하였다.

이 문제와는 상관없이 여담으로 요즘, 정보처리기사 실기 공부를 우선 순위로 해서 병행하고 있는데, 공부하면서도 내가 여러가지 기술을 다뤘다보니 (기초적인 부분이라도) 알고 있다가도 잠시동안 백지 상태가 될 때가 있다. 그런 점이 곧, 내가 부족하다는 증거라고 생각한다. 그걸 요즘 정말 많이 느끼고 있다. 😥

나의 그 부족함을 빨리 채우고 싶다.


👣 참고하기

스택/큐 강의 정리노트 보기

백준 18258번: 큐 2 문제 풀이 보기 (큐, 덱)

백준 2164번: 카드2 문제 풀이 보기 (큐, 덱)

프로그래머스 Lv.2: 주식가격 문제 풀이 보기 (스택/큐)

프로그래머스 Lv.2: 프린터 문제 풀이 보기 (스택/큐)

프로그래머스 Lv.2: 기능개발 문제 풀이 보기 (스택/큐)

프로그래머스 Lv.2: 다리를 지나는 트럭 문제 풀이 보기 (스택/큐)

맨 위로 이동하기

Leave a comment