이 글에서는 파이썬과 판다스(pandas)를 활용하여 100부터 150 사이에 존재하는 소수 중 임의로 5개를 추출하고, 이를 시리즈(Series) 객체로 생성하는 방법을 알아봅니다.
해결 접근 방식
이 문제는 다음과 같은 단계로 해결할 수 있습니다.
소수를 저장할 빈 리스트를 정의합니다.
for 반복문을 생성하고 범위를 100부터 150 미만까지 설정합니다.
중첩된 for 반복문을 사용하여 2부터 해당 값 미만까지 차례대로 나누어 보고, 나누어 떨어지는 수(약수)가 있는지 검사합니다. 약수가 발견되면 break로 내부 반복문을 종료하고, 끝까지 발견되지 않으면 else 블록이 실행되어 그 값을 리스트에 추가합니다.
random 모듈의 sample() 함수로 리스트에서 5개의 값을 무작위로 추출한 뒤, 이를 판다스 시리즈로 변환합니다.
핵심 코드
for i in range(100, 150):
for j in range(2, i):
if(i % j == 0):
break
else:
l.append(i)
여기서 주목할 부분은 파이썬 고유의 for-else 구문입니다. break 없이 반복문이 끝까지 정상적으로 실행되었을 때만 else 블록이 실행됩니다. 즉, 어떤 수로도 나누어 떨어지지 않는다면(약수가 없다면) 그 수는 소수이므로 리스트에 추가되는 방식입니다.
data = rand.sample(l, 5) rand_series = pd.Series(data)
sample() 함수는 리스트에서 중복 없이 지정한 개수만큼의 요소를 무작위로 추출합니다. 따라서 매번 실행할 때마다 서로 다른 소수 조합이 선택됩니다.
전체 예제 코드
아래의 전체 구현 예제를 통해 더 자세히 이해해 보겠습니다.
import pandas as pd
import random as rand
l = []
for i in range(100, 150):
for j in range(2, i):
if(i % j == 0):
break
else:
l.append(i)
data = rand.sample(l, 5)
rand_series = pd.Series(data)
print(rand_series)
실행 결과
무작위 추출이므로 실행할 때마다 출력은 달라지며, 한 번의 실행 결과는 다음과 같습니다.
0 109 1 149 2 107 3 101 4 131 dtype: int64
추가 팁: 성능 최적화
현재 코드는 각 수를 2부터 i-1까지 모두 검사하지만, 실제로는 √i까지만 검사해도 소수 여부를 판별할 수 있습니다. 내부 반복문을 range(2, int(i**0.5) + 1)로 변경하면 연산 횟수를 크게 줄여 더 효율적인 코드가 됩니다. 또한 100~150 범위의 실제 소수 목록은 101, 103, 107, 109, 113, 127, 131, 137, 139, 149로 총 10개이므로, 이 중 5개가 무작위로 선택된다는 점을 참고하면 좋습니다.