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

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

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

단색 문자열 만들기

문제로 돌아가기

해설

0\texttt{0}0의 개수와 1\texttt{1}1의 개수를 각각 C0,C1C_0, C_1C0​,C1​이라고 하자.

만약 C0=0C_0=0C0​=0 또는 C1=0C_1=0C1​=0이면 문자열은 처음부터 단색이므로 답은 00이다.

만약 C0=C1C_0=C_1C0​=C1​이면 문자열 전체를 한 번에 삭제할 수 있으므로 답은 111이다.

이제 C0≠C1C_0 \ne C_1C0​=C1​이고 두 문자가 모두 존재한다고 하자. 더 많이 등장하는 문자를 majority 문자라고 부르자. majority 문자를 +1+1+1, 나머지 문자를 로 바꾼 배열을 라고 하자. 전체 합을 라고 하면 이다.

삭제할 수 있는 부분 문자열은 정확히 합이 000인 구간이다. 따라서 어떤 연산을 여러 번 하더라도 전체 합 DDD는 변하지 않는다. 마지막 문자열은 단색이어야 하므로, 마지막에는 majority 문자만 정확히 DDD개 남아야 한다.

즉, 문제는 다음과 같이 바뀐다.

majority 문자 중 일부를 남기고, 나머지 문자들을 합이 000인 연속 구간들로 나누어 삭제한다. 이때 삭제하는 구간의 개수를 최소화한다.

prefix sum을 다음과 같이 정의하자.

P0=0,Pi=A1+A2+⋯+AiP_0 = 0,\qquad P_i = A_1 + A_2 + \cdots + A_iP0​=0,Pi​=A
0
−1-1−1
AAA
DDD
D>0D>0D>0
1​
+
A2​+
⋯+
Ai​

구간 (l+1,…,r)(l+1,\ldots,r)(l+1,…,r)의 합이 000이라는 것은 Pl=PrP_l=P_rPl​=Pr​이라는 뜻이다.

dpidp_idpi​를 앞의 iii글자까지 처리했고, iii번째 위치가 현재 경계일 때 필요한 최소 연산 횟수라고 하자. 위치 j+1j+1j+1의 문자가 majority 문자라면 이 문자를 남길 수 있다. 이때 이전 경계 iii에서 jjj까지의 구간을 삭제하려면 Pi=PjP_i=P_jPi​=Pj​여야 한다.

같은 prefix sum을 가진 이전 경계들의 dpdpdp 최솟값을 bestbestbest에 저장하면 각 위치마다 O(1)O(1)O(1)에 전이할 수 있다.

전이는 다음 두 경우이다.

  • 바로 현재 majority 문자를 남긴다. 비용은 증가하지 않는다.
  • 같은 prefix sum을 가진 이전 경계에서 현재 위치 직전까지의 비어 있지 않은 구간을 삭제한 뒤 현재 majority 문자를 남긴다. 비용이 111 증가한다.

모든 위치를 처리한 뒤, 마지막 suffix도 합이 000이면 한 번 더 삭제할 수 있다.

전체 시간 복잡도는 O(N)O(N)O(N), 메모리 복잡도는 O(N)O(N)O(N)이다.