Skip to content

Conversation

@oncsr
Copy link
Contributor

@oncsr oncsr commented Sep 14, 2025

🧷 문제 링크

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

🧭 풀이 시간

20분

👀 체감 난이도

✏️ 문제 설명

돌고래 N마리가 있고, 각 돌고래는 ID를 가진다.
돌고래끼리는 아래 조건에 따라 의사소통을 할 수 있다.

  • 각 돌고래는 자신 ID의 1이 아닌 약수 만큼의 주파수를 발생시켜 메시지를 전달할 수 있다.
  • 각 돌고래는 자신 ID의 1이 아닌 약수 만큼 발생하는 주파수를 통해 메시지를 들을 수 있다.
  • 돌고래는 자신이 들은 메시지를 다시 다른 돌고래들에게 전달할 수 있다.

처음 메시지를 전달받는 돌고래가 i일 때, 메시지를 전달받을 수 있는 돌고래 수의 최댓값을 k[i]라고 하자.
max(k[1], ..., k[N])을 구해보자.

🔍 풀이 방법

  • 분리 집합
  • 에라토스테네스의 체

주파수로 가능한 정수는 소수만 고려해도 충분하다.
각 ID를 소인수분해해서 나오는 정수들과 분리 집합으로 이어주면, 같은 컴포넌트 끼리는 메시지를 주고받을 수 있게 된다.
초기 ID의 개수만 기록해두면, 컴포넌트 크기를 구하는 것도 가능하고, union이 모두 끝난 뒤에 반복문 한 번 돌면서 max를 구해줬다.

처음엔 그냥 $O(\sqrt{N})$으로 소인수분해 했더니 시간 초과가 났다.
지금 생각해보면 전체 시간복잡도가 $O(N\sqrt{N})$이 되니까 당연한 결과인 것 같다.

에라토스테네스의 체를 응용해서 e[n]에는 n을 나눌 수 있는 최소 소인수를 저장해서 소인수분해하는 방식으로 해결했다. 이렇게 하면 소인수분해에 걸리는 시간이 $O(\log{N})$이 됨.

⏳ 회고

eezz

@ShinHeeEul ShinHeeEul merged commit 78ffa28 into main Sep 14, 2025
1 check passed
@oncsr oncsr added the success 👍 해설을 보지 않고 풀었을 때 label Sep 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants