<오늘의 삽질>
for i in range(2,2) => nothing
M, N = map(int, input().split())
totalList = [ i for i in range(M, N+1)]
for i in range(2, N+1):
j = 2
while(i*j <= N):
mulVal = i*j
j += 1
if mulVal in totalList:
totalList.remove(mulVal)
else:
continue
for i in totalList:
print(i)
전체 배열 만들어 준 다음에
i가 2부터 돌면서 i의 배수를 전부 배열에서 지워주는 방법
문제의 조건이 (1 ≤ M ≤ N ≤ 1,000,000) 이기 때문에 어림도 없다.
뒤에 알게된 내용이지만 소수를 판별할 때 해당 숫자의 제곱근까지만 확인을 해보면 된다. 이 아이디어를 기반으로? 위에 코드에도 적용을 해보았지만 그래도 시간초과.
1,000,000 길이의 배열을 2번 돈다는 거 자체가 무리인 듯 하다.
한번 돌면서 전부 해결해야 한다
M, N = map(int, input().split())
for i in range(M, N+1):
state = True
if i == 1:
continue
for j in range(2, int(i ** 0.5) + 1):
# 다 확인할 필요없고 제곱근까지만 보면 된다. => 시간 확실히 줄어듬
# 2는 어떻게 해줄거냐? => for in range(2, 2) => nothing
if i % j == 0:
state = False
break
if state == True:
print(i)
i가 2일 경우에 어떻게 예외처리를 해주는 지 계속 고민했다. i == 2인 경우 때문에 계속 틀렸다고 나오나 했다. if 로 2를 따로 빼주고 그랬었는데도 안되더라. 문제는 아래의 코드였다
for j in range(2, int(N ** 0.5) + 1):
N이 아니라 i의 제곱근 만큼만 돌면 되는 것이였다. 왜 저걸 N이라고 박아놨을까 심신미약인가?
그리고 i == 2일 때 어떻게 돌아가는지(2는 소수인데 2%2 는 0이니까) 계속 머리 굴렸던 것도 나름의 일리는 있었다. if로 i==2 일 때 조건을 추가해줘야 하나 했지만,
for i in range(2,2) => nothing.
깔끔하게 해결. 결국은 또 삽질이었다.
추가로
제곱근을 이용하는 방법을 처음 알게 되었다.
N = int(input())
print(int(N ** 0.5) + 1)
# 10 => 4
# 20 => 5
유용하게 쓰일 듯 하다.