소수(prime number)를 구하는 방법은 여러 가지가 있지만 여기서는 가장 간단한 에라토스테네스의 체 방식을 설명하겠습니다. 그리고 이 심사문제는 제너레이터를 작성할 수 있는지 확인하는 것이 목적이므로 소수 판별 코드의 효율성이나 수행 속도는 고려하지 않겠습니다. 어떤 방법을 사용하든 소수만 출력할 수 있으면 됩니다.
에라토스네테스의 체는 2, 3, 5, 7, 11, 13 등 소수의 배수를 제외했을 때 남는 수를 찾는 방식입니다. 심사문제에서는 입력 값의 범위가 크지 않으므로 그냥 2부터 판별할 값 - 1(판별할 값 직전)까지 차례대로 나누어 본 뒤 나누어 떨어지지 않는지 확인하면 됩니다(판별할 값까지 나누어 버리면 아무 숫자도 남지 않으므로 주의해야 합니다).먼저 def prime_number_generator(start, stop):과 같이 함수를 만들어서 시작하는 숫자와 반복을 끝낼 숫자를 매개변수로 받습니다. 그리고 함수 안에서는 for n in range(start, stop):과 같이 두 숫자 사이를 반복합니다. 다시 반복문 안에서 is_prime = True처럼 소수 여부를 저장할 변수를 만들고 True를 저장합니다. 그다음에 for i in range(2, n):과 같이 2부터 판별할 값 - 1까지 반복합니다.
이제 반복문 안에서 if n % i == 0:과 같이 n을 i로 나누었을 때 나머지가 0이면 소수가 아니므로 is_prime에 False를 저장합니다. 마지막으로 for i in range(2, n): 반복문 바깥에서 is_prime이 True이면 yield n으로 함수 바깥에 소수를 전달하면 됩니다.
심사문제의 해설이 제시하는 것처럼 for 문으로 먼저 시도해보기 바랍니다.
for n in range(start, stop):
for i in range(2,start):
이렇게 코드 작성하지 말고, 해설에서 제시하는 것으로 하세요. while은 쓰지 않습니다.
제너레이터를 만드는 건 어려울 수 있습니다.
이 문제는
1. 소수 판별
2. 제너레이터 만들기
두 가지가 있습니다.
먼저 30 50과 같이 두 수의 입력을 받았을 때 30과 50 사이에 있는 소수를 출력하는 코드부터 올바르게 작성해야 합니다.
1번을 먼저 해결한 다음에 이 코드를 제너레이터로 바꾸세요.
1번과 2번을 동시에 하려고 하니 어렵습니다. 현재 코드는 소수를 전혀 판별하지 못하는 것 같습니다.
31 31 32 33 34 35 36 37 37 38 39 40 41 41 42 43 43 44 45 46 47 47 48 49 50오른쪽에 출력된 값이 소수라고 판별해서 출력한 것이라면 소수라기 보단 짝수 출력이고, 규칙에도 일관성이 없어 보입니다.
먼저 소수를 판별하는 것부터 만들어보세요.