하나의 정수가 주어졌을 때, 각 자릿수의 합과 곱을 구한 뒤, 두 값의 차이를 계산하는 문제를 살펴보겠습니다.
예를 들어 숫자가 5362라고 가정해 보겠습니다. 자릿수의 합은 5 + 3 + 6 + 2 = 16이고, 자릿수의 곱은 5 × 3 × 6 × 2 = 180입니다. 따라서 두 값의 차이는 다음과 같습니다.
180 − 16 = 164
해결 접근 방법
이 문제는 매우 간단하게 해결할 수 있습니다. 숫자를 한 자릿수씩 분리하면서 각 자릿수를 누적으로 더하고 곱한 후, 마지막에 곱에서 합을 빼주면 됩니다.
구체적인 과정은 다음과 같습니다.
- 숫자를 10으로 나눈 나머지(%)를 이용해 가장 뒤쪽 자릿수를 추출합니다.
- 추출한 자릿수를 합(sum)에 더하고, 곱(prod)에 곱합니다.
- 숫자를 10으로 나누어(정수 나눗셈) 다음 자릿수로 이동합니다.
- 숫자가 0이 될 때까지 반복합니다.
C++ 구현 예제
아래 코드를 통해 실제 구현 방법을 확인해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int subtractProductAndSum(int n) {
int prod = 1;
int sum = 0;
for(int t = n; t; t /= 10){
sum += t % 10;
prod *= t % 10;
}
return prod - sum;
}
};
main(){
Solution ob;
cout << ob.subtractProductAndSum(5362);
}입력
5362
출력
164
코드 설명
코드의 핵심 로직은 for(int t = n; t; t /= 10) 반복문입니다. 조건식의 t는 t가 0이 아닌 동안 반복을 의미하며, 각 반복마다 t % 10으로 마지막 자릿수를 얻어 합과 곱에 반영한 뒤, t /= 10으로 해당 자릿수를 제거합니다.
이 알고리즘은 숫자의 자릿수 개수만큼만 반복하므로 시간 복잡도는 O(log₁₀n), 즉 자릿수 길이에 비례하며 공간 복잡도는 O(1)로 매우 효율적입니다.