체

체

보통

소개

벼룩시장에서 무작위 컴퓨터 부품이 잔뜩 든 큰 상자를 하나 샀어요. 그 부품들을 조립해서 맞춤형 컴퓨터를 만들기 시작했죠.

여러 부품 조합의 성능을 시험해 보고 싶어졌고, 직접 벤치마킹 프로그램을 만들어서 컴퓨터들을 서로 비교해 보기로 했어요. 그래서 선택한 것이 바로 유명한 "에라토스테네스의 체" 알고리즘이에요. 아주 오래된 알고리즘이지만, 컴퓨터를 한계까지 밀어붙일 만한 알고리즘이죠.

지침

주어진 수 이하의 모든 소수를 찾는 프로그램을 만드는 것이 과제예요. 이 프로그램은 에라토스테네스의 체 알고리즘을 구현해야 해요.

소수는 1보다 큰 수 중에서 1과 자기 자신으로만 나누어떨어지는 수예요. 예를 들어 2, 3, 5, 7, 11, 13은 소수예요. 반대로 6은 소수가 아니에요. 1과 자기 자신뿐만 아니라 2와 3으로도 나누어떨어지기 때문이에요.

에라토스테네스의 체를 사용하려면, 먼저 2부터 주어진 수까지의 모든 수를 목록으로 만들어요. 그다음에는 다음 단계를 반복해요:

  1. 목록에서 표시되지 않은 다음 수를 찾아요 (표시된 수는 건너뛰어요). 이 수가 소수예요.
  2. 그 소수의 모든 배수를 소수가 아니라고 표시해요.

목록의 모든 수를 확인할 때까지 이 단계를 계속 반복해요. 끝나면 표시되지 않은 수는 모두 소수예요.

Note

테스트는 이 알고리즘을 구현했는지가 아니라, 올바른 소수 목록을 만들어냈는지만 확인해요. 에라토스테네스의 체를 제대로 구현하고 있는지 확인하려면, 나눗셈이나 나머지 연산을 사용하지 않는지 확인하는 것이 좋은 첫 번째 테스트예요.

예시

10 이하의 소수를 찾는다고 해봐요.

  • 2, 3, 4, 5, 6, 7, 8, 9, 10을 나열하고, 모두 표시하지 않은 상태로 둬요.
  • 2는 표시되지 않았으므로 소수예요. 4, 6, 8, 10을 "소수 아님"으로 표시해요.
  • 3은 표시되지 않았으므로 소수예요. 6과 9를 소수 아님으로 표시해요 (6을 표시하는 건 선택 사항이에요. 이미 표시되어 있으니까요).
  • 4는 "소수 아님"으로 표시되어 있으니 건너뛰어요.
  • 5는 표시되지 않았으므로 소수예요. 10을 소수 아님으로 표시해요 (선택 사항이에요. 이미 표시되어 있으니까요).
  • 6은 "소수 아님"으로 표시되어 있으니 건너뛰어요.
  • 7은 표시되지 않았으므로 소수예요.
  • 8은 "소수 아님"으로 표시되어 있으니 건너뛰어요.
  • 9는 "소수 아님"으로 표시되어 있으니 건너뛰어요.
  • 10은 "소수 아님"으로 표시되어 있으니, 더 확인할 수가 없어서 멈춰요.

모든 수를 확인한 결과 2, 3, 5, 7이 아직 표시되지 않은 채로 남아 있어요. 이 수들이 10 이하의 소수예요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Scheme Exercism

체 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Scheme 트랙을 연습 문제 39개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.

체 깊이 살펴보기!

중첩 루프와 지연 평가로 시작해 집합으로 넘어가고, 마지막으로 재귀까지 살펴보며 에라토스테네스의 체에 대한 다양한 접근법을 알아봐요.