아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

서로 다른 올바른 괄호 부분 문자열 세기

시간 제한2초메모리 제한512 MB

요약
길이가 100 이하인 괄호 문자열이 주어질 때, 부분수열로 나타나는 서로 다른 비어 있지 않은 올바른 괄호 문자열의 개수를 1,000,000,007로 나눈 나머지로 구한다.
난이도

보통10점 중 7점

유형
동적 계획법, 문자열, 조합론, 구현
정답자
아직 제출이 없습니다

문제

올바른 괄호 문자열은 다음과 같이 재귀적으로 정의된다.

  • 빈 문자열 ""는 올바른 괄호 문자열이다.
  • XX와 YY가 올바른 괄호 문자열이면 XYXY도 올바른 괄호 문자열이다.
  • XX가 올바른 괄호 문자열이면 (X)(X)도 올바른 괄호 문자열이다.
  • 올바른 괄호 문자열은 모두 위 규칙으로 만들 수 있다.

"()", "()()()", "(()())", "(((())))"는 모두 올바른 괄호 문자열이다.

문자열 TT가 문자열 SS의 부분 문자열이라는 말은, SS에서 문자 몇 개를 지워서 TT를 만들 수 있다는 뜻이다. 하나도 지우지 않거나 전부 지워도 된다. 남은 문자의 순서는 바꾸지 않는다. 예를 들어 "bdf"는 "abcdefg"의 부분 문자열이다.

'('와 ')'로만 이루어진 문자열 SS가 주어진다. SS의 비어 있지 않은 부분 문자열 중에서 서로 다른 올바른 괄호 문자열이 몇 개인지 구하는 프로그램을 작성하시오. 지운 위치가 달라도 같은 문자열이 되면 하나로 센다.

입력

첫째 줄에 문자열 SS가 주어진다. SS는 '('와 ')'로만 이루어져 있고, 길이는 11 이상 100100 이하이다.

출력

첫째 줄에 SS의 비어 있지 않은 부분 문자열 중에서 서로 다른 올바른 괄호 문자열의 개수를 1,000,000,007로 나눈 나머지를 출력한다.

예제3

  1. 예제 1

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

    입력
    ())
    
    예상 출력
    1
    
  3. 예제 3

    입력
    )(((
    
    예상 출력
    0