프로그래머스 연습문제
- Lv 1. 소수 찾기 (Python)
https://school.programmers.co.kr/learn/courses/30/lessons/12921
def solution(n):
answer = 0
sosu = list()
for i in range(1, n + 1):
check_sosu = True
for j in range(2, (i//2)+1):
if (j != i and i % j == 0):
check_sosu = False
break
if (i != 1 and check_sosu):
sosu.append(i)
answer = len(sosu)
return answer
def solution(n):
answer = 0
sosu = list()
for i in range(2, n + 1):
check_sosu = True
for j in range(2, int(i ** (1 / 2)) + 1):
if (i % j == 0):
check_sosu = False
break
if(check_sosu):
sosu.append(i)
answer = len(sosu)
return answer
def solution(n):
answer = 0
prime_nums = list()
a = [0, 0] + [1] * (n - 1) # 0부터 n까지 소수판별을 위해 사용할 리스트 (0과 1은 소수에서 제외되므로 0으로 설정, 2부터 n까지는 1로 설정)
for i in range(2, n + 1):
if (a[i] == 1): # 1을 만나면 -> 소수
# prime_nums.append(i)
answer += 1
for j in range(2 * i, n + 1, i): # i가 소수면 -> i의 배수들은 소수에서 제외됨 (약수로 i를 갖기 때문에)
a[j] = 0 # i의 배수들을 0으로 설정 (소수 X)
return answer
에라토스테너스의 체
를 사용해야 한다고 한다… (이게 뭐죠 처음 들어봐요 🤔)에라토스테너스의 체
는 우선 2부터 순서대로 살펴보는데, 만약 새로운 소수를 발견할 때마다 해당 소수의 배수들은 모두 소수가 아니라고 표시하며 걸러가는 알고리즘이다.[0, 0] + [1] * (n-1)
의 배열을 만들어서 판별한다.0
은 소수 X / 1
은 소수 O0
과 1
은 모두 소수가 아니므로 0으로 표기, 2부터 n까지는 우선 배수를 판별하기 전까지는 모두 소수로 해둔다.1
로 표기한다.0
으로 변경한다.0
으로 변경한다.성능이 확실히 좋아졌다 !!!
참고1 : https://chanhuiseok.github.io/posts/algo-42/
참고2 : https://wikidocs.net/21638
정답 코드 ) 2부터 n까지의 배열에서 배수를 찾으면 바로 한번에 제거하는 식
def solution(n):
num=set(range(2,n+1))
for i in range(2,n+1):
if i in num:
num-=set(range(2*i,n+1,i))
return len(num)