가장 짧은 올바른 괄호 문자열

면접 대비

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

요약
괄호 문자열이 주어질 때, 이를 부분 수열로 포함하는 가장 짧은 규칙 괄호열의 길이를 구한다.
난이도

보통10점 중 7점

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

문제

올바른 괄호 문자열(regular brackets sequence)을 다음과 같이 정의한다.

  1. 빈 문자열은 올바른 괄호 문자열이다.
  2. 문자열 SS가 올바른 괄호 문자열이면 (S)(S)와 [S][S]도 올바른 괄호 문자열이다.
  3. 문자열 AA와 BB가 모두 올바른 괄호 문자열이면 두 문자열을 이어 붙인 ABAB도 올바른 괄호 문자열이다.

예를 들어 다음 문자열은 모두 올바른 괄호 문자열이다.

(), [], (()), ([]), ()[], ()[()]

반면 다음 문자열은 모두 올바른 괄호 문자열이 아니다.

(, [, ), )(, ([)], ([(]

(, ), [, ] 네 종류의 문자로 이루어진 문자열이 주어진다. 이 문자열을 부분 수열로 포함하는 가장 짧은 올바른 괄호 문자열을 찾고, 그 길이를 구하여라.

여기서 문자열 a1a2…ana_1 a_2 \dots a_n이 문자열 b1b2…bmb_1 b_2 \dots b_m의 부분 수열이라는 것은, 1≤i1<i2<⋯<in≤m1 \le i_1 < i_2 < \dots < i_n \le m을 만족하는 인덱스가 존재하여 모든 1≤j≤n1 \le j \le n에 대해 aj=bija_j = b_{i_j}가 성립함을 뜻한다.

입력

첫째 줄에 (, ), [, ]로만 이루어진 문자열이 주어진다. 문자열의 길이는 최대 100100이며 다른 문자는 포함되지 않는다. 빈 문자열(빈 줄)이 주어질 수도 있으며, 이는 빈 수열을 의미한다.

출력

주어진 문자열을 부분 수열로 포함하는 올바른 괄호 문자열 중 가장 짧은 것의 길이를 정수 하나로 출력한다.

예제3

  1. 예제 1

    입력
    ([(]
    
    예상 출력
    6
    
  2. 예제 2

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

    입력
    ([)]
    
    예상 출력
    6