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

import sys
input = sys.stdin.readline
while True:
n = int(input())
if n == 0 :
break
num=set(range(2,(n*2)+1))
sub=set(range(2,n+1))
for i in range(2,(n*2)+1):
if i in num:
num-=set(range(2*i,(n*2)+1,i))
num-=sub
print(len(num))
맞긴 했는데 시간이 3894ms였다
이전에 배웠던 방법을 써먹으려고 했는데..
다른 방법으로 응용했어야 했다.
import sys
input = sys.stdin.readline
arr = [1] * (123456 * 2)
arr[0], arr[1] = 0,0
for i in range(2,123456 * 2):
if arr[i]:
for j in range(i*i,123456 * 2,i):
arr[j] = 0
while True:
n = int(input())
if n == 0:
break
else:
print(sum(arr[n+1:n*2+1]))
먼저 n은 123,456까지 입력할 수 있고, n+1 ~ n*2안에서 찾아야 하니까 1이 123456 * 2 개 있는 배열을 만들어 준다
n*2까지 만들어주면 좋겠지만 그러면 while문 안에 넣어야 하고, 시간복잡도가 계속 늘어날 것이다...
그리고 arr[i]가 1이라면(True라면) j의 배수는 모드 0으로 만들어 준다. (위에서는 2*i로 했는데 이미 i*i 이전의 소수가 아닌 수들은 0으로 되어 있기 때문에 i*i로 지정해 줘도 된다.)
그다음 arr의 n+1부터 n*2+1까지의 배열의 값을 모두 더해주면 n+1 ~ n*2 안에 있는 소수들의 개수가 나온다.
| [파이썬/python] 백준 2745번 : 진법 변환 (🥉2) (0) | 2023.03.30 |
|---|---|
| [파이썬/python] 백준 11005번 : 진법 변환 2 (🥉1) (0) | 2023.03.30 |
| [파이썬/python] 백준 11719번 : 그대로 출력하기 2 (🥉3) (0) | 2023.03.29 |
| [파이썬/python] 프로그래머스 : 이중우선순위큐 (Lv.3) (0) | 2023.03.29 |
| [파이썬/python] 프로그래머스 : 소수 만들기 (Lv.1) (0) | 2023.03.29 |