만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

괄호 문자열 나열

면접 대비

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

요약
N과 M이 주어질 때, '('가 ')'보다 작다는 사전순으로 길이 N인 올바른 괄호 문자열 중 M번째를 출력한다.
난이도

보통10점 중 6점

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

문제

올바른 괄호 문자열은 문자 (와 )로만 이루어진 문자열 중에서, 여는 괄호마다 짝이 되는 닫는 괄호가 있고 닫는 괄호마다 짝이 되는 여는 괄호가 있는 문자열이다. 예를 들어 (())()는 올바른 괄호 문자열이지만, (())(()와 ())(()는 아니다.

길이가 같은 두 괄호 문자열 AA와 BB가 다음 두 조건을 모두 만족하면 AA가 BB보다 사전순으로 작다고 하고 A<BA < B로 쓴다.

  1. AA와 BB가 적어도 한 자리에서 다르다.
  2. AA와 BB가 처음으로 달라지는 가장 왼쪽 자리에서 AA는 (이고 BB는 )이다.

예를 들어 (())()<()()()(())() < ()()()이다. 두 문자열은 왼쪽에서 두 번째 자리에서 처음 달라지는데, 앞 문자열은 그 자리가 (이고 뒤 문자열은 )이기 때문이다.

길이 NN을 고정하면 << 관계가 길이 NN인 올바른 괄호 문자열 전체의 순서를 정한다. N=6N = 6일 때 순서는 다음과 같다.

  1. ((()))
  2. (()())
  3. (())()
  4. ()(())
  5. ()()()

NN과 양의 정수 MM이 주어질 때, 이 순서에서 MM번째 올바른 괄호 문자열을 구하라.

입력

첫째 줄에 짝수 NN (2≤N≤20002 \le N \le 2000)과 양의 정수 MM이 공백을 사이에 두고 주어진다. MM은 101810^{18} 이하이고, 길이 NN인 올바른 괄호 문자열의 개수 이하이다.

출력

위에서 정의한 순서로 MM번째인 길이 NN의 올바른 괄호 문자열을 출력한다.

예제7

  1. 예제 1

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

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

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

    입력
    6 1
    
    예상 출력
    ((()))
    
  5. 예제 5

    입력
    6 5
    
    예상 출력
    ()()()
    
  6. 예제 6

    입력
    10 42
    
    예상 출력
    ()()()()()
    
  7. 예제 7

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