코딩테스트/알고리즘

에라토스테네스의 체

math_tbro 2022. 1. 9. 17:41

에라토스테네스의 체

소수를 판별하는 알고리즘.

소수를 대량으로 빠르고 정확하게 구하는 방법.

실제로 코테 문제를 푸는데 시간초과에 늪에 빠져서 이 방법으로 해결한다.

에라토스테네스의 체 원리

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다.
  1. 2를 빼줘서 저장하면서 시작
  1. 그 다음 모든 2의 배수를 제거 해준다.
  1. 다음으로 3을 빼주면서 3에 대한 모든 배수를 제거해준다.
  1. 4는 3번과정에서 지웠으므로 넘어가준다.
  1. 5부터는 다시 5의 배수를 제거해준다.

코드

코드를 보기전에 간략하게 과정을 다시 설명하겠다.

우리가 해야하는건 한가지 숫자를 정하고 그 숫자에 대한 배수를 모두 지워가면서 거르고 거르는 것이다.

64로 예를 들면 루트 64인 8까지 배수들을 다 빼주면 64밑의 소수만 남게된다.

그래서 검사를 제곱급까지만 해도 알아서 다 걸러진다.

코드를 보자

def prime_list(n):
	remove = [True] * n
	
	m = int(n ** 0.5)
	for i in range(2, m+1):
		if remove[i] == True:
			for j in range(i+i, n, i):
				remove[j] = False
	return [i for i in range(2,n) if remove[i] == True]
	

이렇게 하면 좋을 줄 알았는데.... 이렇게 하면 2와 3을 출력하지 못한다. 따라서 조금 보완해줘야한다.

def prime_list(n):
    prime = [True] * n
    
    m = int(n**0.5)
    if n <= 3:
        prime[0] = False
        return [i+1 for i in range(n) if prime[i]==True]
    else :     
        for i in range(2, m+1):
            if prime[i] == True:
                for j in range(i+i, n, i):
                    prime[j] = False
        return [i for i in range(2,n) if prime[i] == True]
prime_list(3)

이러면 완벽한 코드라고 할 수 있겠다.

'코딩테스트 > 알고리즘' 카테고리의 다른 글

백트래킹  (0) 2022.02.02