Post

[BOJ] 머리 톡톡 - 1241 (G5)

[BOJ] 머리 톡톡 - 1241 (G5)
시간 제한메모리 제한
2 초128 MB

문제

N명의 학생이 일렬로 서 있다. 각 학생들의 머리 위에는 자신의 번호가 적혀있다.

주석이는 장난으로 학생들의 머리를 톡톡 친다. 주석이는 i번째 학생을 칠 때, 자신의 번호가 i번째 학생의 번호의 약수인 학생들의 머리를 모두 한 번씩 친다.

각 학생이 머리를 몇 번 맞았는지 구하는 프로그램을 작성하시오.

풀이

에라토스테네스의 체와 유사한 방식으로 해결할 수 있다. 각 번호의 배수들을 미리 계산해 놓는다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
from collections import Counter, defaultdict

input = sys.stdin.readline
print = sys.stdout.write

N = int(input())

students = [int(input()) for _ in range(N)]
MAX_STUDENT = max(students) + 1

counter = Counter(students)
toktok = defaultdict(int)

for i in range(1, MAX_STUDENT):
    for j in range(i, MAX_STUDENT, i):
        if j in counter:
            toktok[j] += counter[i]

print("\n".join(str(toktok[s] - 1) for s in students) + "\n")

시간 복잡도

O(N log N)

This post is licensed under CC BY 4.0 by the author.