728x90
Key Point
1. '에라토스테네스의 체'를 사용하면 해결되는 문제이다.
-> ex) 17이라면 해당 제곱근은 4.xx 즉 2부터 4까지 나눠가며 17이 나눠지는지 판별하는 것이다.
-> ex) 16이라면 해당 제곱근은 4, 16의 약수는 1 2 4 8 16 이다. 약수는 대칭을 이루는데 중간이 되는 지점은 해당 수의 제곱근을 포함한 제곱근 보다 작은 수 범위이다. 그렇기에 제곱근까지 판별하면 가능하다는 의미!
-> 2부터 판별하고 싶은 수의 제곱근 까지 해당수를 나눠가며 나눠지지 않을 경우 소수!
-> 나눠지면 약수가 3개이상(1,자기자신, 나눠 떨어지는 수)이므로 소수가 아님!
알게 된 문법
for i in arr[:]:
정답 코드
import sys
M,N = map(int,sys.stdin.readline().split())
for i in range(M, N+1):
if i==1:
continue
for j in range(2,int(i**0.5) + 1):
if i % j == 0:
break
else:
print(i)
시간 초과
- for j in temp[:] 부분에서 반복문을 돌리며 index의 위치를 고정 시켜주기 위해 해당 문법을 사용해주었는데
temp[:]가 리스트를 복사하는 과정이 있기 때문에 시간이 오래걸려 시간 초과가 된 듯 하다.
import sys
M,N = map(int,sys.stdin.readline().split())
result = []
temp = [i for i in range(2,N+1)]
#for i in temp:
while True:
length = len(temp)
if length == 0:
break
else:
tem = temp[0]
result.append(temp[0])
for j in temp[:]:
if j % tem == 0:
temp.remove(j)
if M > 2:
for i in result:
if i > 2:
print(i)
else:
for i in result:
print(i)
시간 초과
- 가장 무난하게 생각할 수 있는 코드이다. 1부터 자기 자신까지 반복문을 돌려가며 약수의 수가 2인 수를 출력하는 방식.
import sys
M,N = map(int,sys.stdin.readline().split())
cnt = 0
for i in range(M,N+1):
for j in range(1,i+1):
if i % j == 0:
cnt+=1
if cnt == 2:
print(i)
cnt = 0
시간 초과
- 나름 머리를 써서 2의 배수가 무조건 소수가 되지 않는다는 점을 이용하여 처음 반복문을 돌릴 때 2의 배수는 검사하지 않게끔 하였으나 이 또한 시간 복잡도 초과로 인해 실패
import sys
M,N = map(int,sys.stdin.readline().split())
cnt = 0
if M == 2 or M == 1:
print(2)
if M % 2 != 0: #odd
for i in range(M,N+1,2):
for j in range(1,i+1):
if i % j == 0:
cnt+=1
if cnt == 2:
print(i)
cnt = 0
else:
for i in range(M+1,N+1,2):
for j in range(1,i+1):
if i % j == 0:
cnt+=1
if cnt == 2:
print(i)
cnt = 0
728x90
'백준 풀이' 카테고리의 다른 글
[백준/BOJ] - 1654번 python 풀이 - 이분탐색(binary search) (0) | 2022.11.27 |
---|---|
[백준/BOJ] - 1966번 python 풀이 - deque, list 활용 (2) | 2022.11.25 |
[백준/BOJ] - 10845번 python 풀이 - deque, 덱 활용 (0) | 2022.11.23 |
[백준/BOJ] - 10828번 python 풀이 - deque, 덱 활용 (0) | 2022.11.23 |
[백준/BOJ] - 10866번 python 풀이 - deque, 덱 활용 (0) | 2022.11.22 |