괄호

시간 제한1초메모리 제한128 MB

요약
괄호 문자열에서 일부 '(' '(' 짝을 '[' ']'로 되돌려 유효한 괄호 문자열을 만드는 방법 수를 1,000,000,009로 나눈 나머지로 구합니다.
난이도

보통10점 중 6점

유형
동적 계획법, 스택, 문자열
정답자
아직 제출이 없습니다

문제

올바른 괄호 문자열을 다음과 같이 정의한다.

  • ()와 []는 올바른 괄호 문자열이다.
  • A가 올바른 괄호 문자열이면 (A)와 [A]도 올바른 괄호 문자열이다.
  • A와 B가 올바른 괄호 문자열이면 두 문자열을 이어 붙인 AB도 올바른 괄호 문자열이다.

대괄호 쌍([와 그에 대응하는 ])을 적어도 하나 포함하는 올바른 괄호 문자열에서 모든 대괄호 [와 ]를 문자 (로 바꾼 문자열을 부서진 괄호 문자열이라고 한다.

예를 들어 ((와 ((((()))는 부서진 괄호 문자열이다. ((에서는 올바른 괄호 문자열 [] 하나를 복원할 수 있다. ((((()))에서는 다음 네 가지 올바른 괄호 문자열을 복원할 수 있다: []((())), ([](())), (([]())), ((([]))).

부서진 괄호 문자열이 주어졌을 때, 이 문자열로부터 복원할 수 있는 올바른 괄호 문자열의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 부서진 괄호 문자열의 길이 N (2 ≤ N ≤ 30000)이 주어진다. 둘째 줄에는 (와 )로만 이루어진 길이 N의 부서진 괄호 문자열이 주어진다.

출력

부서진 괄호 문자열로부터 복원할 수 있는 올바른 괄호 문자열의 개수를 1,000,000,009로 나눈 나머지를 첫째 줄에 출력한다.

예제4

  1. 예제 1

    입력
    4
    ((()
    
    예상 출력
    2
    
  2. 예제 2

    입력
    8
    ((((((((
    
    예상 출력
    14
    
  3. 예제 3

    입력
    2
    ((
    
    예상 출력
    1
    
  4. 예제 4

    입력
    8
    ((((()))
    
    예상 출력
    4