이 튜토리얼에서는 하나의 숫자를 서로의 차이가 k가 되도록 두 부분으로 나누는 프로그램을 작성해 보겠습니다.
문제 이해하기
먼저 예시를 통해 문제를 살펴보겠습니다.
입력
n = 100 k = 30
출력
65 35
n = 100을 두 수로 나누었을 때 그 차이가 k = 30이 되도록 하는 것입니다. 실제로 65와 35의 합은 100이고, 차이는 정확히 30입니다.
수학적 접근 방식
본격적으로 문제를 해결하기 전에 약간의 수학적 사고가 필요합니다. 핵심 아이디어는 다음과 같습니다.
두 수를 각각 a와 b라고 하면 다음 두 식이 성립합니다.
- a + b = n (두 수의 합)
- a - b = k (두 수의 차이)
이 두 식을 더하면 다음과 같은 결과를 얻을 수 있습니다.
a = (n + k) / 2 b = n - a
즉, n과 k만 주어지면 위 공식을 통해 바로 답을 구할 수 있습니다. 생각보다 간단하죠?
C++ 구현 코드
이제 위 로직을 C++ 코드로 구현해 보겠습니다.
#include <bits/stdc++.h>
using namespace std;
void divideTheNumber(int n, int k) {
double a = (n + k) / 2;
double b = n - a;
cout << a << " " << b << endl;
}
int main() {
int n = 54, k = 12;
divideTheNumber(n, k);
}실행 결과
위 코드를 실행하면 다음과 같은 결과를 확인할 수 있습니다.
33 21
n = 54, k = 12일 때, 33과 21의 합은 54이고 차이는 정확히 12입니다. 공식이 올바르게 작동하는 것을 알 수 있습니다.
마무리
이처럼 간단한 연립방정식을 활용하면 복잡한 반복문 없이도 O(1) 시간 복잡도로 문제를 해결할 수 있습니다. 큰 수가 입력되더라도 동일한 공식을 적용하면 되므로, 오버플로우에 유의하여 자료형을 선택하면 됩니다.
튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.