jun-wiki

View My GitHub Profile

Posts (Latest 10 updated) :
Read all

글 올린지 1분만에 반박당했다…

그것도 책에게 말이다…

바로 뒤에 최적화 한번 더 한 코드가 있을 줄은 몰랐으니 말이다.

어떤 n의 약수 중 하나가 제곱근 보다 크면 다른 하는 무조건 작다는

간단한 명제로 뛰어난 최적화를 하는 모습을 보니

난 재능이 없는게 아닐까 울적해졌다.

직사각형의 변을 예시로 설명하는 글을 보니 바로 이해가 되어서

더 울적해졌고 말이다…(;´д`)ゞ


여기 아래가 그 코드다.

counter = 0                        # 나눗셈 시도 횟수를 세는 변수
ptr = 0                            # 소수 리스트에 현재 저장된 소수 개수(=다음 소수의 위치)
prime = [None] * 500               # 최대 500개의 소수를 저장할 리스트(초기값은 None)

prime[ptr] = 2                     # 첫 번째 소수 2를 저장
ptr += 1                           # 다음 소수 위치로 이동

prime[ptr] = 3                     # 두 번째 소수 3을 저장
ptr += 1                           # 다음 소수 위치로 이동

for n in range(5, 1001, 2):        # 5부터 1000까지 홀수만 검사(짝수는 2 이외에 소수 없음)
    i = 1                          # 소수 리스트에서 3부터 시작(2는 i=0, 3은 i=1)
    while prime[i] * prime[i] <= n:  # 소수 prime[i]의 제곱이 n보다 작거나 같을 때까지(=제곱근 이하까지만 나눠봄)
        counter += 2               # 나눗셈 시도 카운트(while 조건 1회, if문에서 1회)
        if n % prime[i] == 0:      # n이 나누어떨어지면 소수 아님
            break                  # 검사 중단
        i += 1                     # 다음 소수로 이동
    else:                          # while문이 break 없이 끝나면 소수임
        prime[ptr] = n             # n을 소수 리스트에 추가
        ptr += 1                   # 소수 개수+1(다음 위치)
        counter += 1               # (소수로 판정된 경우 추가로 1회 카운트)

for i in range(ptr):               # 찾은 소수만큼 반복
    print(prime[i])                # 소수 출력
print("Counter:", counter)         # 나눗셈 시도 횟수 출력


말 그대로 간단한 아이디어로 인텔리하게 최적해서 할 말이 없다.

그래도 한 수 배운 셈 치기로 했다.


이제 1대1임 ㅇㅇ;;