문제 소개
이 문제에서는 두 값 x와 y가 주어졌을 때, x^(y^2)와 y^(x^2) 중 어느 쪽이 더 큰지 판별하는 것이 과제입니다.
구체적인 예시를 통해 문제를 살펴보겠습니다.
입력: x = 4, y = 3
출력: 3^(4^2)
풀이 설명:
x^(y^2) = 4^(3^2) = 4^9 = 262144
y^(x^2) = 3^(4^2) = 3^16 = 43046721
두 값을 비교해 보면 43,046,721이 더 크므로 정답은 y^(x^2), 즉 3^(4^2)입니다.
해결 접근 방식
두 값을 직접 계산한 후 비교하는 방법도 있지만, x와 y의 값이 커지면 결과값이 기하급수적으로 폭증하여 정수 오버플로우가 발생하기 때문에 실전에서는 사용할 수 없습니다.
이럴 때 유용한 것이 바로 자연로그(ln)입니다. 로그를 취하면 거대한 지수 연산을 훨씬 작은 곱셈 연산으로 변환할 수 있습니다.
각 식의 양변에 자연로그를 적용하면 다음과 같습니다.
ln(x^(y^2)) = (y^2) × ln(x)
ln(y^(x^2)) = (x^2) × ln(y)
그런데 이 값들은 x, y에 단순히 정비례하지 않기 때문에, 양쪽을 공통항인 (x^2) × (y^2)로 나누어 비교를 단순화할 수 있습니다.
ln(x^(y^2)) ÷ ((x^2) × (y^2)) = ln(x) / (x^2)
ln(y^(x^2)) ÷ ((x^2) × (y^2)) = ln(y) / (y^2)
결국 비교 대상은 ln(x)/x² 와 ln(y)/y² 가 되며, 이 값들은 원래 결과값과 반비례 관계에 있습니다.
따라서 다음과 같은 결론을 얻을 수 있습니다.
x > y이면 x^(y^2) < y^(x^2), 반대로 x ≤ y이면 x^(y^2) ≥ y^(x^2)가 성립합니다.
솔루션 구현 코드
위 논리를 C++ 코드로 구현하면 다음과 같습니다.
#include <iostream>
using namespace std;
bool checkGreaterVal(int x, int y) {
// x > y이면 y^(x^2)가 더 크므로 false 반환
if (x > y)
return false;
else
return true;
}
int main() {
int x = 3;
int y = 5;
cout<<"The greater value is ";
if(checkGreaterVal(x, y))
cout<<x<<"^("<<y<<"^2)";
else
cout<<y<<"^("<<x<<"^2)";
return 0;
}
실행 결과
The greater value is 3^(5^2)
코드 설명
checkGreaterVal 함수는 x가 y보다 클 경우 false를 반환해 y^(x^2)가 더 크다는 신호를 보내고, 그 외의 경우에는 true를 반환해 x^(y^2)가 더 크거나 같음을 알립니다. main 함수에서는 이 반환값에 따라 해당하는 식을 화면에 출력합니다. 위 예제에서는 x = 3, y = 5이므로 x < y에 해당하며, 따라서 3^(5^2)가 더 큰 값으로 출력됩니다.