코딩딩/BOJ
[백준 2960번] 문제풀이
전낙타
2023. 6. 4. 20:01
문제
에라토스테네스의 체는 N보다 작거나 같은 모든 소수를 찾는 유명한 알고리즘이다.
이 알고리즘은 다음과 같다.
- 2부터 N까지 모든 정수를 적는다.
- 아직 지우지 않은 수 중 가장 작은 수를 찾는다. 이것을 P라고 하고, 이 수는 소수이다.
- P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.
- 아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다.
N, K가 주어졌을 때, K번째 지우는 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ K < N, max(1, K) < N ≤ 1000)
출력
첫째 줄에 K번째 지워진 수를 출력한다.
예제 입력 1
7 3
예제 출력 1
6
예제 입력 2
15 12
예제 출력 2
7
예제 입력 3
10 7
예제 출력 3
9
2, 4, 6, 8, 10, 3, 9, 5, 7 순서대로 지워진다. 7번째 지워진 수는 9이다.
정답
문제를 풀고 다른 사람들의 풀이를 보았을때 deque를 사용해 문제를 풀이한 사람은 별로 없는것같다.
하지만 시간 복잡도는 O(n^2)으로 같으니 괜찮지 않으려나
"""
deque 짱
"""
import sys
# deque를 사용할거다
from collections import deque as de
input = sys.stdin.readline
# 배열의 범위를 정해주고 K값을 입력받는다.
n, k = map(int, input().split())
# 1부터 n의 값까지 정의된 deque를 만들어준다.
array = de(i for i in range(2, n+1))
# 결과값을 저장할 배열을 만들어준다.
result = []
# array에 값이 있다면
while array:
# a는 배열의 첫번째 수이다
# 배열의 첫번째 수는 소수 a의 배수를 모두 제거한 수 이므로 항상 소수일수밖에 없다.
a = array[0]
# array의 길이만큼 반복한다.
for _ in range(len(array)):
# 만약 array 가장 앞의 값이 a로 나머지 없이 나눠진다면.
if array[0] % a == 0:
# array의 첫번째 값을 추출해서 result에 넣어준다
result.append(array.popleft())
# 만약 소수 a의 배수가 아니라면
else:
# 배열을 한바퀴 회전시켜준다.
array.rotate(-1)
print(result[k-1])