세 개의 값 a, b, x가 주어졌을 때, ab(a의 b제곱)에 가장 가까운 x의 배수를 구하는 문제입니다. 예를 들어 x = 4, a = 3, b = 3이라면 출력 결과는 28이 됩니다. 33 = 27이며, 27에 가장 가까운 4의 배수가 28이기 때문입니다.
문제 해결 접근 방식
해결 방법은 간단합니다. 다음 조건들을 순서대로 확인하면 됩니다.
b < 0이고 a = 1인 경우: ab는 1이 되므로, 가장 가까운 x의 배수는 0 또는 x입니다.
b < 0이고 a > 1인 경우: ab는 1보다 작은 값이 되므로, 가장 가까운 x의 배수는 0입니다.
b > 0인 경우: 먼저 ab를 계산한 뒤, mul = ab / x의 정수 부분으로 정의하면, 가장 가까운 x의 배수는 mul * x 또는 (mul + 1) * x 중 하나입니다. 두 값 중 ab와의 차이가 더 작은 쪽을 선택하면 됩니다.
C++ 구현 예제
#include<iostream>
#include<cmath>
using namespace std;
void findMultiple(int a, int b, int x) {
cout << "Nearest multiple: ";
if (b < 0) {
if (a == 1 && x == 1)
cout << "1";
else
cout << "0";
return;
}
int mul = pow(a, b);
int ans = mul / x;
int ans1 = x * ans;
int ans2 = x * (ans + 1);
if ((mul - ans1) <= (ans2 - mul)) {
cout << ans1;
} else {
cout << ans2;
}
}
int main() {
int a = 3, b = 3, x = 4;
findMultiple(a, b, x);
}실행 결과
Nearest multiple: 28
동작 원리 설명
위 코드의 핵심 로직은 다음과 같습니다.
pow(a, b)함수로 ab 값을 계산합니다.ab를 x로 나눈 몫(ans)을 구한 후, 이를 이용해 바로 아래 배수(ans1 = ans * x)와 바로 위 배수(ans2 = (ans + 1) * x)를 계산합니다.
ab와 두 배수 사이의 거리를 비교하여 더 가까운 값을 출력합니다. 두 거리가 같다면 더 작은 배수(ans1)를 선택합니다.
예제에서는 33 = 27이고, 27 ÷ 4의 몫은 6이므로 후보 배수는 24(6 × 4)와 28(7 × 4)입니다. |27 − 24| = 3이고 |28 − 27| = 1이므로 더 가까운 28이 최종 결과로 출력됩니다.