이 튜토리얼에서는 디세리움(Deserium) 수가 무엇인지 살펴보고, C++ 코드 예제와 함께 주어진 숫자가 디세리움 수인지 판별하는 방법을 알아보겠습니다.
디세리움 수란?
각 자릿수를 거듭제곱한 값들의 합이 원래 수와 같은 숫자를 디세리움 수라고 합니다. 여기서 중요한 점은 가장 높은 자릿수부터 1의 자릿수까지 거듭제곱 지수가 하나씩 감소한다는 것입니다.
예를 들어 135를 살펴보겠습니다.
- 자릿수 개수는 3개입니다.
- 계산 과정: 11 + 32 + 53 = 1 + 9 + 125 = 135
거듭제곱의 합이 원래 수인 135와 같으므로, 135는 디세리움 수입니다.
판별 알고리즘 단계
주어진 숫자가 디세리움 수인지 확인하는 절차는 다음과 같습니다.
- 숫자를 초기화합니다.
- 해당 숫자의 자릿수 개수를 구합니다.
- 합계를 저장할 변수를 0으로 초기화합니다.
- 숫자가 0이 될 때까지 반복합니다.
- 10으로 나눈 나머지를 이용해 마지막 자릿수를 추출합니다.
- pow(자릿값, 남은 자릿수)를 합계에 더합니다.
- 자릿수 카운트를 하나 감소시키고, 숫자를 10으로 나눕니다.
- 반복이 끝난 후 합계가 원래 숫자와 같으면 디세리움 수이고, 그렇지 않으면 아닙니다.
C++ 구현 예제
위 알고리즘을 C++ 코드로 구현하면 다음과 같습니다.
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
// 숫자의 자릿수 개수를 구하는 함수
int getDigitsCount(int n) {
int digitsCount = 0;
do {
digitsCount++;
n = n / 10;
} while (n != 0);
return digitsCount;
}
// 디세리움 수 여부를 판별하는 함수
bool isDeseriumNumber(int n) {
int originalNumber = n;
int digitsCount = getDigitsCount(n);
int sum = 0;
while (n != 0) {
int digit = n % 10; // 마지막 자릿수 추출
sum += pow(digit, digitsCount); // 거듭제곱 값을 합산
digitsCount--; // 지수 감소
n = n / 10; // 다음 자릿수로 이동
}
return sum == originalNumber;
}
int main() {
int n = 135;
// int n = 123; // 디세리움 수가 아닌 경우 테스트
if (isDeseriumNumber(n)) {
cout << "Yes";
}
else {
cout << "No";
}
cout << endl;
return 0;
}코드 동작 원리
getDigitsCount 함수는 do-while 문을 사용해 숫자를 10으로 나누면서 자릿수를 세어 반환합니다. n이 0으로 입력되더라도 한 번은 실행되므로 안전하게 처리됩니다.
isDeseriumNumber 함수는 원래 숫자를 별도 변수에 저장해 둔 뒤, 반복문에서 각 자릿수를 추출하여 지수를 하나씩 줄여가며 거듭제곱 값을 누적합니다. 모든 자릿수에 대한 연산이 끝나면 합계와 원래 숫자를 비교해 결과를 반환합니다.
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Yes
n 값이 135일 때는 "Yes"가 출력되지만, 주석 처리된 123으로 바꾸면 11 + 22 + 33 = 32가 되어 원래 수와 일치하지 않으므로 "No"가 출력됩니다.
마무리
이번 튜토리얼에서는 디세리움 수의 정의와 함께 C++로 이를 판별하는 전체 과정을 살펴보았습니다. 시간 복잡도는 자릿수에 비례하므로 O(log₁₀n)으로 매우 효율적입니다. 튜토리얼에 대해 질문이 있다면 댓글로 남겨주세요.