현욱은 괄호왕이야!!

면접 대비

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

요약
괄호 문자열이 주어질 때, 올바른 괄호 문자열이 되는 가장 긴 연속 부분 문자열의 길이를 구한다.
난이도

보통10점 중 6점

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

문제

여는 괄호 '('와 닫는 괄호 ')'로 이루어진 문자열 가운데 다음 조건을 만족하는 문자열을 올바른 괄호 문자열이라고 부른다.

  1. ()는 올바른 괄호 문자열이다.
  2. 어떤 문자열 x가 올바른 괄호 문자열이면 (x)도 올바른 괄호 문자열이다.
  3. 어떤 문자열 x와 y가 올바른 괄호 문자열이면 xy도 올바른 괄호 문자열이다.

현욱이는 친구에게 생일 선물로 아주 긴 괄호 문자열을 받았다(대체 왜 이런 걸 선물한 걸까?). 하지만 현욱이는 올바른 괄호 문자열이 아니면 몹시 싫어하기 때문에, 받은 문자열에서 연속한 일부분을 잘라 올바른 괄호 문자열을 만들려고 한다. 이왕이면 긴 것이 좋으니 현욱이는 부분 구간을 최대한 길게 잘라내려고 한다. 현욱이를 도와 주어진 괄호 문자열에서 위 조건을 만족하는 가장 긴 부분 문자열의 길이를 구하는 프로그램을 작성해 보자.

입력

첫 줄에 문자열의 길이 n (1 ≤ n ≤ 200,000)이 주어진다.

둘째 줄에 괄호로만 이루어진 길이 n짜리 문자열이 주어진다.

출력

주어진 문자열에서 길이가 가장 길면서 올바른 괄호 문자열인 부분 문자열의 길이를 출력한다. 올바른 괄호 문자열인 부분 문자열을 찾을 수 없으면 0을 출력한다.

힌트

첫 번째 입출력에서 맨 처음 위치부터 4개를 잘라낸 (())가 가장 긴 올바른 괄호 문자열이다.

두 번째 입출력에서 6번째 위치부터 8개를 잘라낸 ()((()))가 가장 긴 올바른 괄호 문자열이다.

예제2

  1. 예제 1

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

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