이 문제에서는 두 개의 비율, 즉 x:y와 y:z가 주어지며, 우리의 과제는 C++에서 세 숫자의 공비를 구하는 프로그램을 작성하는 것입니다.
문제 설명
주어진 두 비율을 이용해 세 숫자의 공비를 찾아야 합니다. x:y와 y:z라는 정보만 가지고 x:y:z 형태의 연비를 완성하는 것이 목표입니다.
예시로 문제 이해하기
입력
3:5 8:9
출력
24 : 40 : 45
풀이 설명 − x:y와 y:z라는 서로 다른 두 비율이 주어져 있습니다. x:y:z를 만들려면 두 비율에서 공통 항인 y를 같은 값으로 맞춰야 하는데, 이때 교차 곱셈(cross multiplication)을 활용합니다.
x/y₁ = y₂/z 이므로, 양변에 적절한 값을 곱해 다음과 같이 변형할 수 있습니다.
(x × y₂) : (y₁ × y₂) : (y₁ × z)
즉, 첫 번째 비율에는 y₂를, 두 번째 비율에는 y₁을 곱해 중간 항을 일치시키면 세 수의 비율 x′:y′:z′를 얻을 수 있습니다.
위 예시에 대입하면 3×8 : 5×8 : 5×9 = 24 : 40 : 45가 세 숫자의 공비가 됩니다.
풀이 접근 방법
앞서 살펴본 것처럼 두 비율의 가운데 항(y)을 동일하게 만드는 것이 핵심입니다. 단순한 교차 곱셈으로도 해결할 수 있지만, 입력 값이 클 경우 결과 숫자가 불필요하게 커질 수 있다는 단점이 있습니다. 따라서 더 효율적인 방법은 최소공배수(LCM)를 활용하는 것입니다.
y₁과 y₂의 최소공배수를 LCM이라 할 때, 세 수의 공비는 아래와 같이 계산됩니다.
x × (LCM ÷ y₁) : LCM : z × (LCM ÷ y₂)
솔루션 동작을 보여주는 예제 프로그램
#include <iostream>
using namespace std;
int calcLcm(int a, int b){
int lcm = 2;
while(lcm <= a*b) {
if(lcm % a == 0 && lcm % b == 0) {
return lcm;
break;
}
lcm++;
}
return 0;
}
void calcThreeProportion(int x, int y1, int y2, int z){
int lcm = calcLcm(y1, y2);
cout << ((x*lcm)/y1) << " : " << lcm << " : " << ((z*lcm)/y2);
}
int main() {
int x = 12, y1 = 15, y2 = 9, z = 16;
cout << "The ratios are\t" << " x:y = " << x << ":" << y1 << "\ty:z = " << y2 << ":" << z << endl;
cout << "The common ratio of three numbers is\t";
calcThreeProportion(x, y1, y2, z);
return 0;
}
출력 결과
The ratios are x:y = 12:15 y:z = 9:16 The common ratio of three numbers is 36 : 45 : 80
코드 설명
calcLcm() 함수는 반복문을 통해 두 수 y₁과 y₂의 최소공배수를 찾습니다. calcThreeProportion() 함수는 구한 최소공배수를 기준으로 각 항을 계산하여 x:y:z 형태의 최종 공비를 출력합니다. 위 예제에서는 LCM(15, 9) = 45이므로, 12×(45÷15) : 45 : 16×(45÷9) = 36 : 45 : 80이 결과로 나타납니다.