KOI 2차 2021 초3- 괄호의 값 비교 > 문제은행 : 정보올림피아드&알고리즘


4798 : 괄호의 값 비교

제한시간
4000 ms   
메모리제한
1024 MB   
해결횟수
20 회   
시도횟수
101 회   

문제

여는 괄호 (와 닫는 괄호 )를 이용해서 만들어지는 문자열 중에서 올바른 괄호열이란 다음과 같이 정의 된다.

 

• 한 쌍의 괄호로만 이루어진 문자열 ()는 올바른 괄호열이다.

• X가 올바른 괄호열이면, X를 괄호로 감싼 (X)도 올바른 괄호열이다.

• X와 Y 가 올바른 괄호열이면, X와 Y 를 이어 붙인 XY 도 올바른 괄호열이다.

• 모든 올바른 괄호열은 위 세 가지 규칙을 통해서만 만들어진다.

 

 예를 들어 (()(()))나 (())()()는 올바른 괄호열이지만, (()나 )((()()은 모두 올바른 괄호열이 아니다.

 우리는 올바른 괄호열 X에 대하여 그 괄호열의 값(괄호값)을 아래와 같이 정의하고 f[X]로 표시한다.

 

• f[()] = 1

• X가 올바른 괄호열이면, f[(X)] = 2 × f[X]

• X와 Y 가 올바른 괄호열이면, f[XY ] = f[X] + f[Y ]

 

 예를 들어 몇 가지 올바른 괄호열들의 괄호값을 구해 보자.

 

• f[()] = 1

• f[(())] = 2 × f[()] = 2 × 1 = 2

• f[()()] = f[()] + f[()] = 1 + 1 = 2

• f[()()()] = f[()] + f[()()] = 1 + 2 = 3

• f[(()())] = 2 × f[()()] = 2 × 2 = 4

• f[((()))] = 2 × f[(())] = 2 × 2 = 4

• f[()(())] = f[()] + f[(())] = 1 + 2 = 3

• f[(()())()(())] = f[(()())] + f[()(())] = 4 + 3 = 7

 

 두 개의 올바른 괄호열 A와 B를 읽고, 두 문자열의 괄호값 f[A]와 f[B]를 비교하는 프로그램을 작성하라.
즉, f[A] = f[B]인지, f[A] < f[B]인지, f[A] > f[B]인지를 판단하는 프로그램을 작성하라.

 

 하나의 입력에서 T개의 테스트 케이스를 해결해야 한다.

 

제약 조건

• 1 ≤ T ≤ 10

• A와 B는 올바른 괄호열이다.

• 하나의 입력에서 주어지는 모든 테스트 케이스의 A의 길이의 합은 3,000,000 이하이다.

• 하나의 입력에서 주어지는 모든 테스트 케이스의 B의 길이의 합은 3,000,000 이하이다.

 

부분문제

1. (3점) A의 길이와 B의 길이는 각각 6 이하이다.

2. (23점) A의 길이와 B의 길이는 각각 50 이하이다.

3. (13점)

   • 여는 괄호와 닫는 괄호의 개수가 같고 모든 닫는 괄호가 모든 여는 괄호의 뒤에 있는 괄호열을 단순 괄호열이라고 하자.

      – 예를 들어 (), (()), ((())), (((((())))))는 단순 괄호열이다.

   • A와 B는 각각 길이가 서로 다른 단순 괄호열 한 개 이상을 이어 붙여 만든 괄호열이다.

      – 예를 들어 ()(()), (((())))()((()))와 같은 문자열이 주어질 수 있다.

      – (())()(())는 단순 괄호열을 이어 붙여 만든 문자열이지만,
        길이가 서로 같은 단순 괄호열 (())이 두 번 붙어 있기 때문에, 이 부분문제에서는 주어지지 않는다.

 

4. (61점) 추가 제약 조건 없음.​ 


입력형식

  첫 번째 줄에 테스트 케이스의 개수 T가 주어진다.

이후 T개의 테스트 케이스가 차례로 주어진다. 각 테스트 케이스의 형식은 다음과 같다.

 

• 첫 번째 줄에 A가 주어진다.

• 두 번째 줄에 B가 주어진다.​ 


출력형식

각각의 테스트 케이스마다, 한 개의 줄에,

 

• f[A] = f[B]이면 =,

• f[A] < f[B]이면 <,

• f[A] > f[B]이면 >

 

을 출력한다.​ 


입력 예

1
(())
()()

설명:
f[A] = f[(())] = 2이고, 
f[B] = f[()()] = 2이므로, 
f[A] = f[B]이다.

출력 예

=

입력 예

1
()()()
(()())

설명:
f[A] = f[()()()] = 3이고, 
f[B] = f[(()())] = 4이므로, 
f[A] < f[B]이다.

출력 예

<

입력 예

2
((()))
()(())
(((())))
()()()()()

설명:
첫 번째 테스트 케이스: 
f[A] = f[((()))] = 4이고, 
f[B] = f[()(())] = 3이므로, 
f[A] > f[B]이다.

두 번째 테스트 케이스: 
f[A] = f[(((())))] = 8이고, 
f[B] = f[()()()()()] = 5이므로, 
f[A] > f[B] 이다.

출력 예

>
>


경기도 안양시 동안구 평촌대로 109 협성골드프라자 601호

TEL : 031-360-4144 FAX : 031-388-0996 E-mail : hancomc@hotmail.com, comkiwer@naver.com

Copyrightⓒ 2010 jungol. All right reserved.

TOP