백준풀이-python

1978 소수 찾기

Fug 2021. 7. 13. 14:14

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

#다이나믹 프로그래밍

 

1978번: 소수 찾기

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

www.acmicpc.net

#1978 소수 찾기

n=int(input())

#수의 개수 n

l=list(map(int,input().split()))

#int로 mapping해서 list로 만듬

dp=[1 for i in range(1001)]

#dp 생성
dp[1]=0
dp[0]=0

#0과 1은 소수가 아님

for i in range(2,33):

#여기서 고민을 좀 했는데 저게 최대이다 왜냐면 1000**(1/2) 가 31.6 머시기 이기 때문에 32부터는 j가 더 작아지게 되 #며 이 말인 즉슨 똑같은 수끼리 다시 곱해진다는 뜻 고로 32까지는 세주어야함 range니깐 33으로 설정

for j in range(i,501):

#i의 최소값인 2가 j와 만났을때 1000보다 작거나 같아야됨 최소값인 500 으로 설정 해야댐 range니깐 501로 설정

if i*j>1000:

#없어도 되긴한데 시간이 너무 길어진다
break
dp[i*j]=0

cnt=0

#카운트 생성

for i in l:

if dp[i]==1:

#위에 for문에서 살아남은 1들은 소수이다 "위에 for문은 1을 제외하고 서로서로 곱함으로써 소수가 아닌것들을 걸러내#는 장치였음

cnt+=1

print(cnt)

 

#원래 다이나믹 프로그래밍으로 하는게 아닌거 같은데 시간이 너무 오래걸리길래 dp로 만들어봤다.