백준: 소수 구하기

2023. 1. 15. 18:38Algorithm

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

 

1929번: 소수 구하기

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

www.acmicpc.net

 

소수를 구하는 식을 표현하는건 쉽다.

하지만 해당 문제의 N의 최대 범위가 100만 까지 들어올 수 있고 시간제한이 2초이기 때문에

시간 복잡도는 O(n^2)이 넘어가서는 안된다.

 

본인도 처음에 이중 포문을 활용하였지만 

수정을 아무리 하여도 시간초과에 막혔었다.

 

알고보니 에라토스테네스의 체라는 공식을 적용해야 통과할 수 있는 문제였다.

에라토스테네스의 체는 소수를 판별할 범위만큼 배열을 할당하여, 해당하는 값을 넣어주고, 이후에 하나씩 지워가는 방법을 이용한다.

1. 배열 초기화

2. 2부터 시작하고 특정 수의 배수에 해당하는 수를 모두 지운다 ( 자기 자신, 이미 지워진 수 제외 )

3. 2부터 시작하여 남아 있는 수를 모두 가져온다.

이를 반영한 코드는 아래와 같다.

# 3~16 사이에 소수를 찾아라
que = list(map(int, input().split()))

for x in range(que[0], que[1] + 1):
    if x == 1:
        continue
    for j in range(2, int(x**0.5) + 1):
        if x % j == 0:
            break
        else:
            print(x)

'Algorithm' 카테고리의 다른 글

백준: 더하기 싸이클  (0) 2023.01.15
백준: 소수 찾기  (0) 2023.01.15
백준: 오븐 시계  (0) 2023.01.15
그룹 애너그램  (0) 2023.01.15
가장 흔한 단어  (0) 2023.01.15