암스트롱 수(Armstrong Number)는 각 자릿수를 세제곱하여 모두 더한 값이 원래 수와 같아지는 수를 말합니다. 예를 들어, 153은 1³ + 5³ + 3³ = 1 + 125 + 27 = 153이므로 암스트롱 수입니다. 이 글에서는 판다스(Pandas) 시리즈에 담긴 숫자 중에서 암스트롱 수만 골라내는 방법을 단계별로 살펴보겠습니다.
다음과 같은 시리즈가 있고, 여기서 암스트롱 수를 필터링한 결과를 얻는다고 가정해 보겠습니다.
original series is 0 153 1 323 2 371 3 420 4 500 dtype: int64 Armstrong numbers are:- 0 153 2 371 dtype: int64
문제 해결 절차
이 문제는 아래 단계를 따라 해결할 수 있습니다.
1단계: 시리즈 정의 및 빈 리스트 생성
먼저 시리즈를 정의합니다. 그다음 빈 리스트를 만들고, for 루프를 사용해 시리즈의 모든 데이터에 하나씩 접근합니다.
l = []
for val in data:
armstrong = 0
temp = val
armstrong 변수는 자릿수 세제곱의 합을 누적하기 위해 0으로 초기화하고, temp 변수에는 시리즈의 각 요소를 임시로 저장합니다.
2단계: while 루프로 자릿수 세제곱의 합 계산
while 루프를 사용해 temp가 0보다 큰 동안 다음 작업을 반복합니다. temp % 10으로 마지막 자릿수(나머지)를 구하고, 그 세제곱을 armstrong에 더합니다. 이후 temp를 10으로 나누어 몫만 남기고, temp가 0이 되면 루프가 자동으로 종료됩니다.
while(temp>0):
rem = temp % 10
armstrong = armstrong + (rem**3)
temp = temp // 10
3단계: 원래 값과 비교하여 리스트에 추가
if 조건문으로 계산된 armstrong 값과 원래 값(val)을 비교합니다. 두 값이 일치하면 해당 수가 암스트롱 수이므로 리스트에 추가합니다.
if(armstrong==val):
l.append(val)
4단계: isin()으로 시리즈 필터링
마지막으로 isin() 메서드를 사용해 리스트에 담긴 값들이 시리즈에 존재하는지 확인하고, 해당 값만 필터링합니다.
data[data.isin(l)]
전체 코드 예제
지금까지 설명한 과정을 하나의 코드로 구현하면 다음과 같습니다.
import pandas as pd
data = pd.Series([153,323,371,420,500])
print("original series is\n", data)
l = []
for val in data:
armstrong = 0
temp = val
while(temp>0):
rem = temp % 10
armstrong = armstrong + (rem**3)
temp = temp // 10
if(armstrong==val):
l.append(val)
print("Armstrong numbers are:-")
print(data[data.isin(l)])
실행 결과
original series is 0 153 1 323 2 371 3 420 4 500 dtype: int64 Armstrong numbers are:- 0 153 2 371 dtype: int64
실행 결과를 보면 153과 371만 암스트롱 수로 필터링된 것을 확인할 수 있습니다. 153은 1³ + 5³ + 3³ = 153, 371은 3³ + 7³ + 1³ = 371이기 때문입니다. 반면 323, 420, 500은 각 자릿수 세제곱의 합이 자기 자신과 같지 않으므로 결과에서 제외되었습니다.