가장 긴 공통 괄호 문자열
시간 제한3초메모리 제한1024 MB
두 괄호 문자열 A와 B가 주어질 때, 둘 다의 부분 문자열이면서 올바른 괄호 문자열인 가장 긴 문자열의 길이를 구합니다. 그런 문자열이 없으면 0을 출력합니다.
문제
(와 )만으로 이루어진 두 문자열 A, B가 주어진다.
A의 부분 문자열이면서 B의 부분 문자열이고, 올바른 괄호열인 서로 다른 문자열들의 집합을 라고 하자.
에 원소가 하나 이상 있는지 판별하고, 원소가 있다면 에서 가장 길이가 긴 문자열의 길이를 구하는 프로그램을 작성하라.
하나의 입력 데이터에서 T개의 테스트 케이스를 해결해야 한다.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.
다음 T개의 각 줄에는, 하나의 테스트 케이스를 구성하는 두 문자열 A와 B가 공백 하나를 사이에 두고 주어진다.
출력
각각의 테스트 케이스마다, 주어진 순서대로 한 개의 줄에 출력한다.
- 가 공집합이면 0을 출력한다.
- 에 원소가 하나 이상 있으면, 그중 가장 길이가 긴 문자열의 길이를 출력한다.
제한
는 하나의 입력에서 주어지는 모든 A의 길이 합이고, 는 하나의 입력에서 주어지는 모든 B의 길이 합이다.
- A와 B는 각각 여는 괄호와 닫는 괄호로만 이루어진 길이 1 이상의 문자열이다.
힌트
올바른 괄호열의 정의
올바른 괄호열은 다음과 같이 정의된다.
- 한 쌍의 괄호로만 이루어진 문자열
()는 올바른 괄호열이다. - X가 올바른 괄호열이면, X를 괄호로 감싼
(X)도 올바른 괄호열이다. - X와 Y가 올바른 괄호열이면, X와 Y를 이어 붙인 XY도 올바른 괄호열이다.
- 모든 올바른 괄호열은 위 세 가지 규칙을 통해서만 만들어진다.
예를 들어 (()(()))와 (())()()는 올바른 괄호열이지만, (()와 )((()()는 올바른 괄호열이 아니다.
부분 문자열의 정의
길이가 l인 문자열 s와 인 정수 i, j에 대해, s[i..j]는 s의 i번째 문자부터 j번째 문자까지를 순서대로 이은 문자열이다. 이러한 문자열을 s의 부분 문자열이라고 한다.
예를 들어 s가 ()(()()이면 s[1..5]는 (()이고, s[1..7]은 ()()이다. 따라서 (()과 ()()은 ()(()()의 부분 문자열이다. 하지만 )()(은 ()(()()의 부분 문자열이 아니다.