도저희 이해가 안가네요..
377
投稿した質問数 9
제 머리를 탓해야겠지요 ㅠㅠ 이 부분은 일단 그냥 넘어가야겠네요.
回答 2
4
사실 이 로직은 소수를 구하는 에라토스테네스의체의 방식을 먼저 이해하고 그걸 어떻게 파이썬으로 로직화 시켰는지에 대한 내용이라 조금 어렵게 느껴지실 수도 있습니다. 아래 위키의 내용을 먼저 살펴보시는것도 이해하시는데 도움이 되실 수도 있을것 같습니다.

위의 위키피아에 있는 이미지가 에라토스네의체가 어떤 식으로 흘러가는지를 아주 간단명료하게 표현하고 있습니다. 일단 어떤식으로 동작하는지를 먼저 이해 했다고 치고 대략적으로 위의 코드에 중요한 부분을 설명하자면....
prime_list = [False, False] + [True] * (num - 1)
최초 prime_list 는 사용자에게 입력된 숫자만큼(num-1) 의 리스트에서 0, 1 은 False 로 설정하고 2부터는 True 로 입력된 숫자만큼 True 설정하게 됩니다. 예를 들어 사용자가 6을 입력했다고 하면..
prime_list = [False, False, True, True, True, True]
이렇게 prime_list 가 초기화 되게 됩니다. 그리고 아래 코드를 보시면 2부터 for 문을 돌면서 수를 체크하게 됩니다.
prime_list = [False, False] + [True] * (num - 1)
primes = []
for i in range(2, num + 1):
if prime_list[i]:
for j in range(2 * i, num + 1, i):
# 소수가 아니면 False
prime_list[j] = False
최초 if prime_list[i] 는 위에서 True 로 설정되었기 때문에 참이 되고 그 숫자의 배수(2 * i) 를 모두 False 로 설정합니다. 배수는 나눌수 있는 숫자라는 의미기 때문에 소수가 아닙니다. 이 부분이 위의 GIF 이미지에서 최초 빨간색으로 칠해지는 영역이 됩니다. 그렇게 되면 다음 for 문을 돌때 False 로 설정된 배수들은 if 문에 걸리지 않고 그냥 통과하게 됩니다. 이런 알고리즘을 이해하고자 할때는 입력수를 작은수로 입력하고 (예를 들어 5정도..) 그리고 이중 for 문의 i, j 값 그리고 prime_list 의 값을 모두 print 문을사용해서 화면에 출력해보고 직접 눈으로 보면서 이해하는 과정이 도움이 많이 됩니다. 큰 수를 입력하고 확인하려면 너무 복잡해보이기 때문에 작은수 부터 하나씩 입력해보면서 각 변수의 값이 어떻게 변화해 가는지를 직접 확인해보는것이 중요합니다.
while True:
num = input("2 이상의 숫자를 입력하세요")
if not num.isnumeric:
continue
num = int(num)
if num < 2:
continue
break
prime_list = [False, False] + [True] * (num - 1)
primes = []
for i in range(2, num + 1):
if prime_list[i]:
for j in range(2 * i, num + 1, i):
# 소수가 아니면 False
prime_list[j] = False
print("i={}, j={}, prime_list={}".format(i, j, prime_list))
primes = [i for i in range(2, num+1) if prime_list[i] == True]
print(primes)
if num in primes:
print("소수에요.")
else:
print("소수가 아닙니다.")
위의 코드처럼 print 문을 추가해서 현재 내용을 출력해보면서 알고리즘을 이해하는데 도움을 받을 수 있습니다. 위의 코드를 실행해서 입력값으로 5를 입력하고 화면에 출력된 값을 살펴보면...
i=2, j=4, prime_list=[False, False, True, True, False, True] (최초 i 가 2인경우 2의 배수 모두 False)
i=3, j=4, prime_list=[False, False, True, True, False, True] (i 가 3인 경우 리스트에는 5까지만 있으므로 6패스)
i=4, j=4, prime_list=[False, False, True, True, False, True] (위와 같음)
i=5, j=4, prime_list=[False, False, True, True, False, True] (위와 같음)
위와 같은 결과를 얻을 수 있습니다.
결론은 True 의 자릿수를 보면 2, 3, 5 만 남고 입력된 값 5 이하의 소수는 2, 3, 5를 확인할 수 있게 되는 그런 내용입니다. 충분하시지 않으실 수 있겠지만 그래도 도움이 되셨으면 좋겠습니다.
38강 = 연산자 더하고 빼기
0
59
2
주석처리
0
116
1
함수의 파라미터값 msg
0
154
1
강의자료 이미지 안나옴
0
238
3
강의자료 질문 두번째
0
164
3
강의자료 관련 질문
0
115
1
파이썬 예외 처리 try / except 파일 처리 코드가 실행이 안됩니다.
0
234
1
소수 너무 어려워요
0
244
1
imagefont 함수 사용
0
238
1
pylint
0
355
1
add 함수 문의 ㅠㅠ
0
280
1
형식 문의드립니다.
0
208
1
변수 명을 왜 src, tar로 하셨는지 궁금합니다.
0
601
1
숫자야구 코드를 짜 봤는데 뭔가 이상합니다.
0
249
1
zsh: command not found: pylint
0
268
1
텔레그램 봇 만들기 코드 실행이 안됩니다 박사님..ㅠ
0
545
1
질문드립니다.
1
373
2
list.reverse() 출력에 대해서 질문있습니다.
1
431
1
데코레이터 함수 및 동작시간 질문입니다.~
1
322
2
opencv 사용하면서 궁금한점 (해상도)
1
780
1
질문드립니다.
1
298
1
아래 오류가 뜨면서 vscode가 컴파일이 되지 않는데.. 혹시 왜이럴까요?
1
444
1
크롤링안되는 현상 문의 드립니다.
1
420
1
파이썬 크롤링 관련 문의
1
276
1

