백준 34829 '매드 맥스'

DoubleDeltas·2026년 3월 26일

알고리즘 문제풀이

목록 보기
114/116

https://www.acmicpc.net/problem/34829

아이디어

이 문제에서 수열의 '순서'는 중요하지 않으므로 수열이 아닌 집합으로 생각하자.

기본적으로 AA의 최댓값 1개만을 선택한 부분집합 B={max(A)}B=\left\{\max(A)\right\}에 대해 med\mathrm{med} 값이 최대가 되며, 이 이상 원소를 더하는 것은 med\mathrm{med} 값을 늘릴 수 없다. 그러나 BB00부터 연속하여 원소를 추가할 수 있다면, 그 길이만큼 mex\mathrm{mex} 값이 더해져 결과에 영향을 미침을 알 수 있다.

med\mathrm{med} 값은 BB의 크기가 22씩 늘어날 때마다 변함에 주목하라. mex\mathrm{mex} 값의 증가를 위해 00부터 연속적으로 이을 숫자를 추가할 때, 다음 선택으로 인한 med\mathrm{med}값의 감소를 최대한 줄이기 위해서는, 다음에는 무조건 반드시 선택되지 않았던 값들 중 최댓값을 선택해야 함을 알 수 있다. 그러므로 만약 원소를 추가할 것이라면, 둘을 동시에 추가해야만 한다.

이상을 정리하면,

  • '집합' AA에서 ii번째로 큰 값을 MiM_i
  • m=N2m=\lfloor\frac{N}{2}\rfloor

라 했을 때, AA의 부분집합 BB에 대해 med(B)+mex(B)\mathrm{med}(B)+\mathrm{mex}(B)는 다음 후보 중 최댓값이다.

  • B={M1}B=\left\{M_1\right\}일 때 M1+0M_1+0
    • AA의 모든 원소는 서로 다르고 A=N2|A|=N\geq2이므로 M1M_1는 반드시 00이 아니다. 그러므로 mex(B)=0\mathrm{mex}(B)=0.
  • 추가로 만약 0A0 \in A라면, B={0}{M1}B=\left\{0\right\}\cup\left\{M_1\right\}일 때 M1+1M_1+1
  • 추가로 만약 1A1 \in A라면, B={0,1}{M2,M1}B=\left\{0, 1\right\}\cup\left\{M_2, M_1\right\}일 때 M2+2M_2+2
  • ...
  • 추가로 만약 m1Am-1 \in A라면, B={0,1,,m1}{Mm,...,M2,M1}B=\left\{0, 1, \cdots, m-1\right\}\cup\left\{M_m, ..., M_2, M_1\right\}일 때 Mm+(m1)M_m+(m-1)
  • 추가로 만약 mAm \in A라면, B=AB=A일 때 med(A)+m\mathrm{med}(A)+m
  • 추가로 만약 m+1Am+1 \in A라면, B=AB=A일 때 med(A)+(m+1)\mathrm{med}(A)+(m+1)
  • ...
  • 추가로 만약 N1AN-1\in A라면, B=AB=A일 때 med(A)+(N1)\mathrm{med}(A)+(N-1)

코드 (Python)

N=int(input())
S=sorted(map(int,input().split()))
a=S[-1]
for i in range(N):
    if S[i]!=i:break
    a=max(a,S[max(N//2, N-1-i)]+i+1)
print(a)

메모리 및 시간

  • 메모리: 145328 KB
  • 시간: 164 ms

후기

  • 지인이 만들었다는 문제라 풀게 되었다. 좋은 그리디 문제인 것 같다.
profile
유사 개발자

0개의 댓글