[20250308] BOJ / G2 / MEX / 권혁준 #215
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
🧷 문제 링크
https://www.acmicpc.net/problem/23820
🧭 풀이 시간
60분
👀 체감 난이도
✏️ 문제 설명
길이$N$ 인 수열 $A_1, A_2, \cdots, A_N$ 이 주어지면, $mex( [ A_i \times A_j\ | 1 \le i \le j \le N ] )$ 를 구해보자.
$mex(S)$ 는
집합 S에 포함되지 않은 가장 작은 0 이상의 정수이다.🔍 풀이 방법
[사용한 알고리즘]
우선, 수열의 원소가$2,000,000$ 이하라서 이보다 큰 가장 작은 소수는 절대로 만들 수 없다. => 이 소수를 $P$ 라고 하자.
그리고, 수열에 0이나 1이 없는 경우는 mex값이 각각 0, 1이므로 제외하고 생각한다.
풀이
수열의 원소 중 작은 수부터 볼 것이다.
1️⃣ 어떤 수$a$ 가 수열에 존재하고, $a$ 보다 작은 수들 내에서 $mex$ 값이 $a$ 이상이라면, $a$ 부터 $a^2$ 까지 수 중 $a$ 의 배수는 항상 만들 수 있다고 봐도 상관없다.
따라서, 등장한 원소들 각각에 대해, 직접$A_i$ 부터 ${A_i}^2$ 까지의 $A_i$ 배수들을 만들 수 있다고 체크해주면 된다. ( => 구현은 boolean 배열로 했다.)
이후, 체크한 배열을 돌며 만들 수 없는 가장 작은 수를 찾아내면 된다.
1️⃣ 의 증명
만약$a$ 부터 $a^2$ 까지 수 중 만들 수 없는 $a$ 의 배수가 있다고 가정하고, 그 수를 $a \times b$ 라고 하자.
$b < a$ 이기 때문에, $b$ 가 없어서 생기는 곱의 부재는 $a \times b$ 까지 오기 전에 $b \times b$ 에서 걸러지기 때문이다.
예시
수열$A = [0, 1, 2, 3, 5, 6]$ 이라고 가정하자.$6$ 에 대해, 그 전까지의 수들만을 이용해 $mex$ 를 $6$ 이상으로 만들 수 있다.
$6$ 부터 $36$ 까지의 $6$ 의 배수들을 모두 만들 수 있다고 가정했지만, 실제로는 $6 \times 4 = 24$ 를 만들 수 없다.$mex$ 값으로 $24$ 가 가능한지 확인하기 전에, 이미 $4$ 의 부재로 $mex$ 는 $16$ 을 만들 수 없게 된다.
원소
하지만,
시간복잡도
이 문제에서 중복 값을 가지는 원소가 있다면, 굳이 여러 번 수행할 필요 없이 중복을 제거해도 상관없다.
각 원소$A_i$ 에 대해, 체크 작업의 연산량은 $\dfrac{2,000,000}{A_i}$ 이다.$X$ 라 할 때, $O(\frac{X}{2} + \frac{X}{3} + \cdots + \frac{X}{X})$ 이다.
$\Rightarrow$ $O(X\log{X})$ 이다. (조화수열의 합 $\frac{1}{1} + \frac{1}{2} + \cdots + \frac{1}{X} = O(\log{X})$ 이기 때문)
따라서 시간 복잡도는 원소의 최댓값을
더 쉬운 풀이
풀고 나니까 훨씬 더 쉬운 풀이가 생각났다.
각 원소$A_i$ 의 배수들 중 $P$ 보다 작은 수들을 $K$ 라고 하자.$\frac{K}{A_i}$ 가 수열에 존재하는지 체크해서, $K$ 를 만들 수 있는지 여부를 저장한다.
반복문 한 번으로
이 역시 조화수열의 합에 의해 시간 내에 통과될 수 있는 풀이다.
⏳ 회고
진짜 수학 너무 어렵다