세 개의 숫자 a, b, c가 주어졌을 때, 각 숫자에서 0을 모두 제거한 후에도 a + b = c가 성립하는지 확인해야 합니다. 예를 들어 a = 102, b = 130, c = 2005라고 가정해 보겠습니다. 각 숫자에서 0을 제거하면 a + b = c는 (12 + 13 = 25)가 되므로 이 식은 참이 됩니다.
문제를 해결하는 접근 방식은 매우 간단합니다. 먼저 숫자에서 모든 0을 제거하는 함수를 작성하고, 그 변환된 값들을 사용하여 a + b = c가 여전히 성립하는지 검사하면 됩니다.
알고리즘 동작 원리
deleteZeros 함수는 숫자의 마지막 자릿수부터 한 자리씩 확인하면서, 해당 자릿수가 0이 아닌 경우에만 결과 값에 더합니다. 이때 place 변수는 현재 자릿수의 위치(1, 10, 100...)를 추적하여 0이 제거된 자릿수들이 올바른 순서로 배치되도록 합니다. 이후 isSame 함수에서 세 숫자를 각각 변환한 뒤 등식이 성립하는지 비교합니다.
예제 코드
#include <iostream>
#include <algorithm>
using namespace std;
int deleteZeros(int n) {
int res = 0;
int place = 1;
while (n > 0) {
if (n % 10 != 0) { // 마지막 자릿수가 0이 아니라면
res += (n % 10) * place;
place *= 10;
}
n /= 10;
}
return res;
}
bool isSame(int a, int b, int c){
if(deleteZeros(a) + deleteZeros(b) == deleteZeros(c))
return true;
return false;
}
int main() {
int a = 102, b = 130, c = 2005;
if(isSame(a, b, c))
cout << "a + b = c is maintained";
else
cout << "a + b = c is not maintained";
}출력 결과
a + b = c is maintained
실행 결과 a = 102, b = 130, c = 2005에서 0을 제거하면 각각 12, 13, 25가 되고, 12 + 13 = 25가 성립하므로 등식이 유지됨을 확인할 수 있습니다. 이 알고리즘은 숫자의 자릿수만큼 반복하므로 시간 복잡도는 O(log₁₀n)입니다.