DOJ logoDOJ
문제
최근 추가된 문제들저장한 문제
카테고리DLC대회그룹팀게시판
랭킹
문제 풀이 랭킹스트릭 랭킹DOJ Power 랭킹
현황
문제 제안로그인회원가입
DOJ logoDOJ

OI 서브태스크 채점, Elo 레이팅, Discord 인증을 갖춘 커뮤니티 온라인 저지.

문제
문제 목록카테고리
커뮤니티
대회랭킹게시판공지사항외부 대회 개최이용 안내
계정
로그인회원가입채점 현황
정책
이용약관DLC 이용 규칙개인정보 처리방침API 사용 설명서언어별 채점 환경대회 순위 보상레이팅과 퍼포먼스
© 2026 DOJ
모든 권리 보유
해설

괄호 나누기

문제로 돌아가기

해설

서브태스크 2: K=1K=1K=1

조각은 문자열 전체 하나뿐이다. SSS는 좋은 괄호 문자열이므로 가능한 ()를 모두 지우면 아무 문자도 남지 않는다. 따라서 X=0X=0X=0이고, SSS를 그대로 출력하면 된다.

서브태스크 1: 분할과 재배열을 모두 완전 탐색하기

N≤10N\leq 10N≤10이므로 K−1K-1K−1개의 절단 위치를 모두 고를 수 있다. 한 분할이 정해지면 K!K!K!개의 조각 순서를 모두 시도하고, 각 순서에서 인접한 ()를 스택으로 지워 점수를 계산한다. 각 분할에서 모그가 만들 수 있는 점수의 최댓값을 구하고, 그 값이 가장 작은 분할을 선택한다.

이 방법은 문제의 정의를 그대로 구현한 것이다. 다음 단계에서는 한 분할의 값을 조각 순열을 나열하지 않고 계산한다.

고정된 분할의 점수

문자열의 괄호 높이를 H0=0H_0=0H0​=0으로 두고, Si=(S_i=\texttt{(}Si​=(이면 , 이면 로 정의한다. 또한 라 하자. 은 로 이루어진 조각을 뜻한다.

조각 S(l,r]S(l,r]S(l,r]에서 가능한 ()를 모두 지우면 닫는 괄호 Hl−ml,rH_l-m_{l,r}Hl​−ml,개 뒤에 여는 괄호 개가 남는다. 따라서 , 로 정의한다.

절단 위치가 0=t0<t1<⋯<tK=N0=t_0<t_1<\cdots<t_K=N0=t0​<t1​<⋯<t일 때 , 라 두면, 이 분할의 값은 정확히 이다.

이를 증명하자. iii번 조각을 모두 지운 결과가 닫는 괄호 aia_iai​개 뒤에 여는 괄호 bib_ibi​개가 오는 형태라 하자. 그러면 ai=Hti, 이다.

δi=bi−ai\delta_i=b_i-a_iδi​=bi​−ai​라 하면 전체 문자열의 괄호 합이 이므로 이고, 이다.

특정 조각 iii의 닫는 괄호를 처리한 직후의 괄호 합을 최대한 작게 만들고 싶다고 하자. δj<0\delta_j<0δj​<0인 다른 조각을 모두 먼저 배치한 뒤 iii번 조각을 배치하면, 그 순간 부족한 여는 괄호의 수는 ∑j≠i(−δj)++a가 된다.

반대로 어떤 순서에서도 iii번 조각 앞에서 만들 수 있는 음의 괄호 합은 모든 음수 δj\delta_jδj​를 먼저 모은 경우보다 작을 수 없으므로, 이보다 큰 부족량을 만들 수 없다.

따라서 모그가 만들 수 있는 최대 부족량은 D+max⁡imin⁡(ai,bi)=D+Q\displaystyle D+\displaystyle \max_i\min(a_i,b_i)=D+QD+imax​min(ai​,b 이다. 전체 괄호 합이 이므로 마지막에는 닫는 괄호와 여는 괄호가 각각 개 남고, 점수는 이다.

서브태스크 4: 완전히 중첩된 문자열

S=(N/2)N/2S=\texttt{(}^{N/2}\texttt{)}^{N/2}S=(N/2)N/2인 경우, 높이 그래프는 한 번 증가한 뒤 한 번 감소한다. 모든 구간에서 내부 최솟값은 양 끝 높이 중 작은 값과 같으므로 q(l,r)=0q(l,r)=0q(l이다. 따라서 이고 만 최소화하면 된다.

절단 위치의 높이를 차례대로 적으면 처음과 끝은 모두 000이다. 높이 그래프의 왼쪽에서는 경계가 한 칸 이상 이동할 때마다 높이가 적어도 111 증가하고, 오른쪽에서는 적어도 111 감소한다. 왼쪽에서 오른쪽으로 봉우리를 가로지르는 조각은 최대 하나이므로, KKK개의 조각 중 적어도 K−1K-1K−1개 조각에서는 양 끝 높이가 서로 다르다. 따라서 절단 위치 높이들의 총 변화량은 적어도 K−1K-1이다.

처음과 끝 높이가 같으므로 총 증가량과 총 감소량은 같다. DDD는 총 감소량이므로 D≥⌈K−12⌉=⌊K2⌋D\geq\left\lceil\frac{K-1}{2}\right\rceil=\left\lfloor\frac K2\right\rfloorD≥⌈2K−1​⌉이다.

K=2q+1K=2q+1K=2q+1이면 왼쪽에서 여는 괄호 qqq개를 한 글자씩 떼고, 가운데 남은 부분을 한 조각으로 두고, 오른쪽에서 닫는 괄호 qqq개를 한 글자씩 뗀다. K=2qK=2qK=2q이면 왼쪽에서 여는 괄호 개를 한 글자씩 떼고, 가운데 남은 부분을 한 조각으로 두고, 오른쪽에서 닫는 괄호 개를 한 글자씩 뗀다. 두 경우 모두 위 하한을 달성한다. 따라서 이다.

서브태스크 5: 모든 마지막 조각을 보는 동적 계획법

이제 QQQ의 상한을 ccc로 고정하자. 모든 조각이 q(l,r)≤cq(l,r)\leq cq(l,r)≤c를 만족하도록 제한했을 때, dp[k][r]\mathrm{dp}[k][r]dp[k]를 앞의 개 문자를 정확히 개 조각으로 나누는 데 필요한 의 최솟값으로 정의한다.

마지막 조각이 S(l,r]S(l,r]S(l,r]이면 점화식은 다음과 같다.

dp[k][r]=min⁡0≤l<r q(l,r)≤c(dp[k−1][l]+d(l,r))\mathrm{dp}[k][r] =\min_{\substack{0\leq l<r\ q(l,r)\leq c}} \left(\mathrm{dp}[k-1][l]+d(l,r)\right)dp[k][r]=

ccc는 0,1,…,N/20,1,\ldots,N/20,1,…,N/2만 확인하면 된다. 고정된 ccc에서 얻는 후보는 c+dp[K][N]c+\mathrm{dp}[K][N]c+이다. 최적 분할의 실제 를 로 잡으면 그 분할이 DP에 포함된다. 반대로 DP가 찾은 분할의 실제 는 이하이므로, 모든 에 대해 구한 최솟값이 정확한 가 된다.

한 ccc에서 전이 수는 O(KN2)O(KN^2)O(KN2)이고 가능한 ccc가 O(N)O(N)O(N)개이므로 시간 복잡도는 이다. 에서는 충분하다. 부모 위치를 저장하면 분할도 복원할 수 있다.

만점 제약에서는 마지막 조각의 시작점 lll을 모두 보는 전이를 줄여야 한다. 이를 위해 최적해를 매우 적은 종류의 조각만 사용하는 형태로 바꾼다.

조각을 희소한 형태로 정규화하기

각 경계 iii에 대해 같은 높이가 직전에 나온 위치를 pi=max⁡{j<i:Hj=Hi}p_i=\max\{j<i:H_j=H_i\}pi​=max{j<i:H로 정의한다. 가 존재할 때만 사용한다.

다음 두 종류의 조각만 고려하자.

  • 한 글자 조각 (i−1,i](i-1,i](i−1,i].
  • 같은 높이의 직전 위치부터 현재까지의 조각 (pi,i](p_i,i](pi​,i].

정점이 0,1,…,N0,1,\ldots,N0,1,…,N인 DAG로 보면 i−1→ii-1\to ii−1→i와 pi→ip_i\to ip만 존재한다. 따라서 각 정점으로 들어오는 간선은 최대 두 개이다.

임의의 조각 (l,r](l,r](l,r]은 DDD의 합과 QQQ의 최댓값을 증가시키지 않으면서 위 두 종류의 조각들로 세분할 수 있다.

Hl=HrH_l=H_rHl​=Hr​인 경우를 먼저 보자. 중간에 높이 HlH_lH인 경계 가 있으면 와 로 나눈다. 두 조각의 는 모두 이고, 각 조각의 내부 최솟값은 원래 조각의 내부 최솟값 이상이므로 두 도 원래 이하이다. 중간에 같은 높이가 없다면 이므로 이미 두 번째 종류이다.

Hl<HrH_l<H_rHl​<Hr​이라 하자. rrr 이전에 높이 HlH_l이 마지막으로 등장하는 위치를 라 한다. 이면 와 로 나눈다. 첫 조각은 양 끝 높이가 같고, 두 번째 조각은 높이 아래로 내려가지 않으므로 이다. 두 조각의 도 모두 이다. 이면 첫 문자는 반드시 이므로 한 글자 조각 을 떼어 낸다. 나머지 조각의 는 이다.

Hl>HrH_l>H_rHl​>Hr​이라 하자. lll 이후 처음으로 높이 HrH_r에 도달하는 위치를 라 한다. 이면 와 로 나눈다. 첫 조각의 내부 최솟값은 이므로 이고 이다. 두 번째 조각은 양 끝 높이가 같고 이다. 이면 마지막 문자는 반드시 이므로 한 글자 조각 을 떼어 낸다. 나머지 조각의 는 이고, 두 조각의 합은 원래 와 같다.

각 단계에서 조각의 길이가 줄어드므로 이 과정을 반복하면 원하는 형태만 남는다.

정확히 KKK개와 KKK개 이상의 관계

원래의 KKK개 조각을 위 방법으로 세분하면 조각 수는 어떤 L≥KL\geq KL≥K가 되고 값은 증가하지 않는다.

반대로 희소 DAG의 경로가 L>KL>KL>K개의 조각을 사용했다면, 인접한 조각들을 합쳐 정확히 KKK개로 만들 수 있다. 조각을 합치면 모그가 선택할 수 있는 순열은 합치기 전 순열 중 각 묶음 내부의 순서를 고정한 경우들로 제한된다. 모그의 선택지가 줄어드므로 분할의 값은 증가하지 않는다.

따라서 원래 문제의 최적값은 다음 문제와 같다.

희소 DAG에서 000부터 NNN까지 가는 경로 중 간선 수가 KKK 이상인 경로의 D+QD+QD+Q 최솟값을 구한다.

희소 간선의 비용

한 글자 간선 i−1→ii-1\to ii−1→i에서 Si=(S_i=\texttt{(}Si​=(이면 d=q=0d=q=0이고, 이면 , 이다. 따라서 이 간선은 에 를 더한다.

Hi=Hi−1+1H_i=H_{i-1}+1
Hi​=Hi−1​+1
Si=)S_i=\texttt{)}Si​=)
Hi=Hi−1−1H_i=H_{i-1}-1Hi​=Hi−1​−1
ml,r=min⁡l≤x≤rHx\displaystyle m_{l,r}=\displaystyle \min_{l\leq x\leq r}H_xml,r​=l≤x≤rmin​Hx​
S(l,r]S(l,r]S(l,r]
Sl+1,Sl+2,…,SrS_{l+1},S_{l+2},\ldots,S_rSl+1​,Sl+2​,…,Sr​
r
​
Hr−ml,rH_r-m_{l,r}Hr​−ml,r​
d(l,r)=max⁡(Hl−Hr,0)d(l,r)=\max(H_l-H_r,0)d(l,r)=max(Hl​−Hr​,0)
q(l,r)=min⁡(Hl,Hr)−ml,rq(l,r)=\min(H_l,H_r)-m_{l,r}q(l,r)=min(Hl​,Hr​)−ml,r​
K​
=
N
D=∑i=1Kd(ti−1,ti)D=\displaystyle \sum_{i=1}^{K}d(t_{i-1},t_i)D=i=1∑K​d(ti−1​,ti​)
Q=max⁡1≤i≤Kq(ti−1,ti)Q=\displaystyle \displaystyle \max_{1\leq i\leq K}q(t_{i-1},t_i)Q=1≤i≤Kmax​q(ti−1​,ti​)
2(D+Q)2(D+Q)2(D+Q)
−1−mti−1,tia_i=H_{t_{i-1}}-m_{t_{i-1},t_i}
ai​=Hti−1​​−mti−1​,ti​​
bi=Hti−mti−1,tib_i=H_{t_i}-m_{t_{i-1},t_i}bi​=Hti​​−mti−1​,ti​​
00
0
∑iδi=0\displaystyle \sum_i\delta_i=0i∑​δi​=0
D=∑i(−δi)+D=\displaystyle \sum_i(-\delta_i)_+D=i∑​(−δi​)+​
i=D+min⁡(ai,bi)\displaystyle \sum_{j\ne i}(-\delta_j)_+ + a_i=D+\min(a_i,b_i)
j=i∑​(−δj​)+​+ai​=D+min(ai​,bi​)
i
​
)
=
D+
Q
000
D+QD+QD+Q
2(D+Q)2(D+Q)2(D+Q)
,
r
)
=
0
Q=0Q=0Q=0
DDD
K−1
=
⌊2K​⌋
qqq
q−1q-1q−1
X=2⌊K/2⌋X=2\lfloor K/2\rfloorX=2⌊K/2⌋
[
r
]
rrr
kkk
DDD
0≤l<r q(l,r)≤c​
min
​
(dp[k−1][l]+d(l,r))
dp
[
K
]
[
N
]
QQQ
ccc
QQQ
ccc
ccc
D+QD+QD+Q
O(KN3)=O(N4)O(KN^3)=O(N^4)
O(KN3)=O(N4)
N≤70N\leq 70N≤70
j
​
=
Hi​}
pip_ipi​
i
​
→
i
l
​
uuu
(l,u](l,u](l,u]
(u,r](u,r](u,r]
ddd
000
qqq
q(l,r)q(l,r)q(l,r)
l=prl=p_rl=pr​
Hl​
uuu
u>lu>lu>l
(l,u](l,u](l,u]
(u,r](u,r](u,r]
HlH_lHl​
q(u,r)=0q(u,r)=0q(u,r)=0
ddd
000
u=lu=lu=l
(
(l,l+1](l,l+1](l,l+1]
qqq
000
Hr​
uuu
u<ru<ru<r
(l,u](l,u](l,u]
(u,r](u,r](u,r]
HrH_rHr​
q(l,u)=0q(l,u)=0q(l,u)=0
d(l,u)=Hl−Hrd(l,u)=H_l-H_rd(l,u)=Hl​−Hr​
d(u,r)=0d(u,r)=0d(u,r)=0
u=ru=ru=r
)
(r−1,r](r-1,r](r−1,r]
qqq
000
ddd
d(l,r)d(l,r)d(l,r)
d=
q=
0
Si=)S_i=\texttt{)}Si​=)
d=1d=1d=1
q=0q=0q=0
DDD
[Si=)][S_i=\texttt{)}][Si​=)]

점프 간선 pi→ip_i\to ipi​→i는 양 끝 높이가 같으므로 d=0d=0d=0이다. 이 간선의 qqq를 qi=Hi−min⁡pi≤x≤iHxq_i=H_i-\displaystyle \min_{p_i\leq x\leq i}H_xqi​=Hi​−pi​≤x≤i라 하자.

만점 풀이: 병목값 QQQ를 고정한 희소 DP

허용할 최대 점프 라벨을 ccc로 고정한다. dp[k][i]\mathrm{dp}[k][i]dp[k][i]를 000에서 iii까지 정확히 kkk개 간선을 사용하고, 사용한 모든 점프 간선이 qi≤cq_i\leq cqi​≤c를 만족할 때 가능한 DDD의 최솟값으로 정의한다. 초깃값은 dp[0][0]=0\mathrm{dp}[0][0]=0dp[0][0]=0이고 나머지는 무한대이다.

iii로 들어오는 간선은 최대 두 개이므로 전이는 다음과 같다.

dp[k][i]=min⁡(dp[k−1][i−1]+[Si=)],dp[k−1][pi])\mathrm{dp}[k][i] =\min\left( \mathrm{dp}[k-1][i-1]+[S_i=\texttt{)}], \mathrm{dp}[k-1][p_i] \right)dp[k][i]=min(dp[k−1][i−1]+[Si​=)],dp[k−1][pi​])

두 번째 항은 pip_ipi​가 존재하고 qi≤cq_i\leq cqi​≤c일 때만 사용할 수 있다.

고정된 ccc에서 답 후보는 c+min⁡k≥Kdp[k][N]c+\displaystyle \min_{k\geq K}\mathrm{dp}[k][N]c+k≥Kmin​dp[k][N]이다. 어떤 경로의 실제 최대 점프 라벨이 Q∗Q^*Q∗라면 c=Q∗c=Q^*c=Q∗에서 그 경로가 고려된다. 반대로 임의의 ccc에서 DP가 찾은 경로의 실제 QQQ는 ccc 이하이다. 따라서 모든 ccc에 대한 후보의 최솟값은 정확한 D+QD+QD+Q이다.

확인할 ccc는 {0}∪{qi:pi가 존재한다}\{0\}\cup\{q_i:p_i\text{가 존재한다}\}{0}∪{qi​:pi​가 존재한다}만으로 충분하다. 최적 경로의 최대 점프 라벨은 000이거나 실제로 사용한 점프 간선의 라벨이기 때문이다.

pip_ipi​는 높이별 마지막 위치를 저장하여 구할 수 있다. qiq_iqi​는 단순한 O(N2)O(N^2)O(N2) 전처리로 계산해도 전체 복잡도에 영향을 주지 않는다. 가능한 ccc가 O(N)O(N)O(N)개이고, 고정된 ccc에서 k=1,2,…,Nk=1,2,\ldots,Nk=1,2,…,N과 i=1,2,…,Ni=1,2,\ldots,Ni=1,2,…,N을 한 번씩 계산하므로 전체 시간 복잡도는 O(N3)O(N^3)O(N3)이다.

값만 계산할 때는 이전 kkk층만 필요하므로 메모리 복잡도는 O(N)O(N)O(N)이다. 실제 분할을 출력하려면 최적의 ccc와 간선 수를 찾은 뒤, 그 ccc에서 DP를 한 번 더 수행하며 부모 간선을 저장한다. 얻은 경로가 L>KL>KL>K개 조각을 사용했다면 인접한 조각을 합쳐 정확히 KKK개로 만든다. 부모 배열을 저장하는 구현의 메모리 복잡도는 O(N2)O(N^2)O(N2)이다.

최종 답 XXX는 구한 D+QD+QD+Q의 최솟값에 222를 곱한 값이다.

Solution written by GPT5.6

min
​
Hx​