암스트롱 수란 무엇일까요?
k자리 숫자 N이 있다고 가정해 봅시다. 이때 각 자릿수를 k제곱한 값들을 모두 더한 합이 N 자신과 같다면, 그 수를 암스트롱 수(Armstrong Number)라고 부릅니다. 예를 들어 153은 세 자리 수이며, 1³ + 5³ + 3³ = 1 + 125 + 27 = 153이므로 대표적인 암스트롱 수입니다. 그 밖에도 370, 371, 407 등이 암스트롱 수에 해당합니다.
따라서 우리가 작성해야 할 프로그램은 주어진 수가 암스트롱 수이면 true를, 그렇지 않으면 false를 반환하면 됩니다.
문제 해결 접근 방법
다음 단계를 차례대로 따르면 문제를 쉽게 해결할 수 있습니다.
- power := 숫자의 자릿수
- temp := n, res := 0 으로 초기화
- temp가 0이 아닌 동안 반복
- res := res + (temp를 10으로 나눈 나머지)의 power제곱
- temp := temp / 10 (정수 나눗셈)
- 반복이 끝난 후 res와 n이 같으면 true 반환, 그렇지 않으면 false 반환
구현 예제
아래 파이썬 코드를 통해 더 잘 이해할 수 있습니다. 참고로 poww 함수는 '거듭제곱의 빠른 연산(Exponentiation by Squaring)' 기법을 활용해 제곱을 효율적으로 계산합니다.
import math
class Solution(object):
def poww(self, base, power):
res = 1
while power:
if power & 1:
res *= base
base *= base
power >>= 1
return res
def isArmstrong(self, n):
power = int(math.log10(n)) + 1
temp = n
res = 0
while temp:
res += self.poww(temp % 10, power)
temp //= 10
return res == n
ob1 = Solution()
print(ob1.isArmstrong(153))입력
153출력
true코드 설명
isArmstrong 함수는 먼저 math.log10을 이용해 입력값 n의 자릿수를 구합니다. 이후 temp 변수에 n을 복사한 뒤, 일의 자리 숫자부터 하나씩 추출하여 해당 자릿수만큼 거듭제곱한 값을 res에 누적합니다. 마지막으로 누적된 값 res가 원래 수 n과 일치하는지 비교하여 결과를 반환합니다. 위 예제에서 153은 각 자릿수의 세제곱 합과 같으므로 true가 출력됩니다.