반응형
문제 출처:
https://www.acmicpc.net/problem/1978
1978번: 소수 찾기
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
www.acmicpc.net
문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력
주어진 수들 중 소수의 개수를 출력한다.
풀이 방법
백준 17425 약수의 합(https://yoon-e.tistory.com/7) 문제와 매우 유사하다.
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 | ||||
3 | 3 | 3 | ||||||
4 | 4 | 4 | ||||||
5 | 5 | |||||||
6 | 6 | |||||||
7 | 7 | |||||||
8 | 8 | |||||||
sum | 1 | 3 | 4 | 7 | 6 | 12 | 8 | 15 |
'소수'의 정의에 대해 생각해보면, 2 이상의 자연수 중 1과 자기자신만을 약수로 가지는 자연수를 말한다. 즉, 약수의 합이 1+N 이라면 그 N은 약수인것을 알 수 있다.
이 문제에선 N은 최대 1000까지 주어지므로, 1000까지의 f(N)을 구해둔다면, 입력 데이터들을 for loop 한번으로 소수의 개수를 구할 수 있다.
import sys
x = int(sys.stdin.readline())
data = list(input().split())
savechartTemp = [1]*1001
for i in range(2,1001):
for j in range(1,(1000//i)+1):
savechartTemp[j*i] = savechartTemp[j*i] + i
sol = 0
for i in data:
#약수의 합(savechartTemp[int(i)])가 i+1과 같다면 i는 소수이다.
if savechartTemp[int(i)] == int(i)+1 and int(i)!=1:
sol = sol+1
print(sol)
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[Python] 백준 17425번: 약수의 합 (파이썬,수학,정수론) (0) | 2023.02.27 |
---|---|
[Python] 백준 17425번: 약수의 합 (파이썬,수학,정수론) (0) | 2023.02.27 |
[Python] 백준 17427번: 약수의 합2 (파이썬) (0) | 2023.02.21 |
[Python] 백준 4375번: 1 (나머지, 부르트포스, 파이썬) (0) | 2023.02.20 |
[Python] 백준 10430번: 나머지 (파이썬) (0) | 2023.02.20 |