[Baekjoon] 1978. 소수 찾기

1 minute read

소수 찾기

문제 설명


문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

출력

주어진 수들 중 소수의 개수를 출력한다.

예제 입력 1

4
1 3 5 7

예제 출력 1

3


문제 풀이


문제 자체는 소수인지 판별하는 단순한 문제인데, 소수 판별 알고리즘은 어느 문제에나 적용될 수 있으니 이번에 확실히 숙지하자.


첫 번째로, 가장 직관적인 방법으로 숫자 n에 대해 2부터 root(n) 까지의 숫자 중 n이 나누어 떨어지는 수가 있으면 소수가 아니라고 할 수 있습니다.

n = int(input())
nums = list(map(int, input().split()))
ans = 0
for num in nums:
    for i in range(2, int(num**(1/2))+2):
        if num % i == 0: break
    else: ans += 1
print(ans)

하지만 위의 방법은 각 숫자에 대해 매번 for문을 돌기 때문에, 큰 숫자들이 주어지면 시간이 매우 오래 걸립니다.


따라서, 우리는 에라토스테네스의 체라는 소수 찾기 알고리즘을 사용하도록 합니다.

n = int(input())
nums = list(map(int, input().split()))
maxnum = max(nums)
# 에라토스테네스의 체
isPrime = [False, False] + [True]*(maxnum-1)
for i in range(2, int(maxnum**(1/2))+1):
    if isPrime[i]:
        for j in range(2*i, maxnum+1, i):
            isPrime[j] = False

print(sum([isPrime[num] for num in nums]))

에라토스테네스의 체는 가장 큰숫자 maxnum에 대해 2부터 root(maxnum)까지 for문을 돌며 각 숫자의 배수를 지워갑니다. for문을 끝까지 돈 후에도 그 값이 True이면 소수인 것입니다.

소수를 찾아야 할 상황이 온다면, 이 알고리즘을 사용하여 풀이하는 것이 효율적일 것입니다.

Leave a comment