#1929

zzwwoonn·2022년 5월 28일
0

Algorithm

목록 보기
37/71

<오늘의 삽질>
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

유용하게 쓰일 듯 하다.

0개의 댓글