시간 제한 | 메모리 제한 | 제출 | 정답 | 맞힌 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 1024 MB | 18 | 8 | 6 | 42.857% |
한별이는 문자 P
와 @
만을 사용하는 프로그래밍 언어를 만들었다.
한별이의 언어에서 올바른 프로그램을 이루는 문자열의 규칙은 다음과 같다.
P
와 @
중 하나여야 하며, 같은 문자가 $4$번 이상 연속해서 등장하면 안 된다.PPP
를 (
로 바꾸고, @@@
을 )
로 바꾼 다음, 남아있는 P
와 @
을 지우면 올바른 괄호열이 되어야 한다.이때 올바른 괄호열이란 다음과 같이 정의된다.
(
$X$)
도 올바른 괄호열이다.한별이의 언어는 프로그램을 실행하기 전에, 카운터 변수 $C$의 값을 $0$으로 초기화하고, 프로그램에 대해 전처리로 다음과 같은 과정을 순서대로 거친다.
PPP
를 (
로 바꾼다.@@@
을 )
로 바꾼다.P
를 +
로 바꾼다.@
을 -
로 바꾼다.예를 들어, 프로그램이 PPP@PP@PP@@@
라고 하면, 전처리를 거친 후에는 (-++-++)
이 된다.
전처리한 프로그램을 실행할 때, +
는 $C$를 $1$ 증가시키고, -
는 $1$ 감소시킨다. 한편, (
와 )
는 반복문으로, (
와 )
사이의 코드를 $3$ 번 반복해서 실행한다.
이를 의사코드로 표현하면 다음과 같다. 이때 문자열 $S$에 대해 $S[i]$ 는 $i$ 번째 문자를, $S[i..j]$는 문자열 $S$에서 $i$ 번째 문자부터 $j$ 번째 문자까지(경계 포함)의 부분 문자열을 의미한다.
Algorithm run
(전처리한 프로그램 $S$)
while
$i$ $\leq$ $S$의 길이
if
$S[i]$가 +
면
else if
$S[i]$가 -
면
else if
$S[i]$가 (
면
)
의 인덱스로 설정한다.run
($A[i+1..j-1]$)을 $3$ 회 실행한다.정수 $N$이 주어졌을 때, 프로그램 실행 후 $C$의 값이 $N$인 길이가 가장 짧은 올바른 프로그램 중에서, 사전 순으로 가장 빠른 프로그램을 출력하라. (@
이 P
보다 사전 순으로 앞선다.)
첫째 줄에 테스트케이스의 개수 $T$가 주어진다. ($1 \leq T \leq 10\,000$)
각 테스트케이스마다 한 줄에 정수 $N$이 주어진다. ($1 \leq |N| \leq 10^{18}$)
각 줄마다 각 테스트케이스에 대해 프로그램 실행 후 $C$의 값이 $N$인 길이가 가장 짧은 올바른 프로그램 중 사전 순으로 가장 빠른 프로그램을 출력하라.
4 1 3 6 -2
P PP@PP PPP@PP@PP@@@ @@