본문 바로가기
Algorithm/Python

백준 - 1929 - 소수 구하기 - Python

by imagineer_jinny 2021. 3. 8.

1929번: 소수 구하기 (acmicpc.net)

 

1929번: 소수 구하기

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

www.acmicpc.net

문제

M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.

출력

한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.

 

풀이

def isSosu(v):
  for i in range(2, int(v**0.5)+1):
    if v%i==0: return 0
  return 1*(v!=1)

a,b=map(int, input().split())

for i in range(int(a),int(b)+1):
  if isSosu(i)==1:
    print(i)

isSoSu function을 정의하여 각 값이 소수인지 아닌지 판별한다. 

이 때, range를 2~v 로 설정하면 시간초과가 뜨기 때문에 sqrt(v)로 설정해줄 것!

 

 

백준 1929번 파이썬 풀이: 소수 구하기 (tistory.com)

 

백준 1929번 파이썬 풀이: 소수 구하기

백준 1929번 소수 구하기 알고리즘 분류: 수학, 정수론, 소수 판정, 에라토스테네스의 체 링크: https://www.acmicpc.net/problem/1929 1929번: 소수 구하기 첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어

yoonsang-it.tistory.com

 

사용된 개념

 

에라토스테네스의 체

일정 범위내 수열에서 배수들을 제거해 소수만 남기는 방법

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

에라토스테네스의 체

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2

ko.wikipedia.org

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.

그림의 경우,  11² > 120 이므로 11보다 작은 수의 배수들만 지워도 충분하다. 즉, 120보다 작거나 같은 수 가운데 2, 3, 5, 7의 배수를 지우고 남는 수는 모두 소수이다.

 

-파이썬으로 구현

def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n

    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False

    # 소수 목록 산출
    return [i for i in range(2, n) if sieve[i] == True]

 

제곱근 이용

루트를 하는 방식:당연하게도 제곱(**)을 이용

# 2의 루트 
print("2의 루트 : ", 2**(1/2)) 
2의 루트 : 1.4142135623730951

댓글