하나의 8진수(octal)가 주어졌을 때, 해당 수의 10진수 표현이 7로 나누어 떨어지는지 확인하는 문제를 살펴보겠습니다.
예를 들어 입력이 n = 61이라면 결과는 True입니다. 8진수 61의 10진수 값은 6×8 + 1 = 48 + 1 = 49이며, 49는 7로 나누어 떨어지기 때문입니다.
접근 방법
이 문제는 8진법의 수학적 성질을 활용하면 매우 간단하게 해결할 수 있습니다. 8을 7로 나눈 나머지는 1이므로(8 ≡ 1 (mod 7)), 8진수 각 자릿수의 합을 7로 나눈 나머지는 원래 수를 7로 나눈 나머지와 같습니다. 이는 10진법에서 "각 자릿수의 합이 9로 나누어 떨어지면 그 수도 9로 나누어 떨어진다"는 잘 알려진 성질과 동일한 원리입니다.
따라서 실제로 10진수 변환을 수행하지 않고도 다음 단계만으로 판별할 수 있습니다.
- 자릿수 합(digit_sum)을 0으로 초기화합니다.
- num이 0이 아닌 동안 다음을 반복합니다.
- digit_sum에 num을 10으로 나눈 나머지(마지막 자릿수)를 더합니다.
- num을 10으로 나눈 몫으로 갱신합니다.
- 반복이 끝난 후 digit_sum을 7로 나눈 나머지가 0이면 True를, 아니면 False를 반환합니다.
구현 예제
def solve(num):
digit_sum = 0
while num:
digit_sum += num % 10
num = num // 10
return digit_sum % 7 == 0
num = 61
print(solve(num))
참고로 원본 코드에서는 변수 이름으로 sum을 사용했지만, 이는 파이썬 내장 함수 sum()과 이름이 겹치므로 위 예제처럼 digit_sum과 같은 이름을 사용하는 것이 좋은 습관입니다.
더 파이썬다운 구현
문자열 변환과 내장 함수를 활용하면 한 줄로도 해결할 수 있습니다.
def solve(num):
return sum(int(d) for d in str(num)) % 7 == 0
num = 61
print(solve(num))
입력
61
출력
True
8진수 61의 각 자릿수 합은 6 + 1 = 7이고, 7은 7로 나누어 떨어지므로 True가 출력됩니다. 실제로 10진수 값인 49 역시 7로 나누어 떨어지는 것을 확인할 수 있습니다.