문제 이해
두 개의 숫자 a와 b가 있다고 가정해 보겠습니다. 이때 (a + b)와 (a - b)를 동시에 계산할 수 있는 함수를 정의해야 합니다.
그런데 C++에서 함수는 기본적으로 최대 하나의 값만 반환할 수 있습니다. 그렇다면 두 개 이상의 결과를 어떻게 함수 밖으로 전달할 수 있을까요?
해답은 포인터(pointer)를 활용한 출력 매개변수(output parameter)입니다. 함수 인자에 포인터를 전달하고, 함수를 호출할 때 해당 변수들의 주소(address)를 넘겨주면 함수 내부에서 원본 변수의 값을 직접 수정할 수 있습니다.
이 문제에서는 다음과 같이 처리합니다.
a를 a + b의 값으로 갱신
b를 a - b의 값으로 갱신
따라서 함수를 호출할 때는 반드시 두 변수의 주소를 인자로 전달해야 합니다.
예를 들어 입력이 a = 15, b = 18이라면 출력은 다음과 같습니다.
a + b = 33
a - b = -3
해결 접근 방법
다음 단계를 따라 문제를 해결할 수 있습니다.
solve()라는 함수를 정의합니다. 이 함수는 a와 b의 주소를 매개변수로 받습니다.
temp 변수에 두 변수 값의 합(*a + *b)을 저장합니다.
b가 가리키는 변수에 두 변수 값의 차(*a - *b)를 저장합니다.
a가 가리키는 변수에 temp 값을 대입합니다.
여기서 temp를 먼저 계산하는 것이 중요합니다. *a의 값이 변경되기 전에 합을 미리 저장해 두지 않으면 올바른 결과를 얻을 수 없기 때문입니다.
예제 코드
아래 구현 예시를 통해 더 자세히 이해해 보겠습니다.
#include <iostream>
using namespace std;
int solve(int *a, int *b){
int temp = *a + *b;
*b = *a - *b;
*a = temp;
}
int main(){
int a = 15, b = 18;
solve(&a, &b);
cout << "a + b = " << a << " and a - b = " << b;
}입력
15, 18
출력
a + b = 33 and a - b = -3
코드 설명
main 함수에서 solve(&a, &b)를 호출하면 변수 a와 b의 메모리 주소가 함수로 전달됩니다. 함수 내부에서 역참조 연산자(*)를 사용해 해당 주소에 저장된 실제 값에 접근하고 수정합니다. 함수가 종료된 후 main 함수의 a에는 33(합), b에는 -3(차)이 저장되어 있으므로, 별도의 return 없이도 두 개의 결과를 동시에 얻을 수 있습니다.