[ BOJ / Python ] 에라토스테네스의 체

황승환·2021년 11월 26일
0

Python

목록 보기
34/498

보통 에라토스테네스의 체 문제는 소수를 찾는 문제로 자주 등장한다. 에라토스테네스의 체의 원리는 다음과 같다.

  • 1~100 범위의 수 안에서의 소수를 구한다고 가정한다.
  • 가장 작은 수인 2는 소수 배열에 넣고 2의 배수를 모두 False로 체크해준다.
  • 그 다음 작은 수인 3을 소수 배열에 넣고 3의 배수를 모두 False로 체크해준다.
  • 그 다음 작은 수인 4는 이미 2의 배수로 False 체크가 되어 있으므로 그 다음 작은 수인 5를 소수 배열에 넣어주고 5의 배수를 모두 False 체크해준다.
  • 100 이하의 범위에서 모두 처리해주면 소수 배열에는 1~100 범위의 소수만 들어가게 된다.

이 문제는 에라토스테네스의 체를 활용하여 해결하였다.

  • n과 k를 입력받는다.
  • k번째로 지운 수의 여부를 확인하기 위한 변수 cnt를 0으로 정의해준다.
  • 2부터 n까지의 수를 채운 것을 구현하기 위한 num배열을 True로 채워준다.
  • 2중 for문을 i와 j에 대해서 돌린다. 이때 i의 범위는 2부터 num배열의 길이+1이 되고, j의 범위는 i부터 n+1까지가 되고, j는 i씩 증가한다.
    -> 만약 num[j]가 True라면 이를 False로 변경해주고, cnt를 1 증가시킨다.
    -> 만약 cnt가 k와 같다면 j가 바로 k번째로 지운 수가 되므로 j를 출력해주고 break로 반복문을 탈출한다.

Code

n,k=map(int, input().split())
cnt=0
num=[True]*(n+1)
for i in range(2, len(num)+1):
    for j in range(i, n+1, i):
        if num[j]==True:
            num[j]=False
            cnt+=1
            if cnt==k:
                print(j)
                break

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글