문제 정의
조건 연산자(if, 삼항 연산자 등)를 사용하지 않고, 변수에 두 개의 후보 값 중 현재 값이 아닌 다른 값을 할당하는 것이 이번 글의 목표입니다.
문제 설명
변수 a는 두 변수 x와 y 중 하나의 값을 가지고 있습니다. 우리가 해야 할 일은 a의 현재 값을 확인하지 않고(즉, 어떠한 조건문도 사용하지 않고) 나머지 다른 값으로 바꾸는 프로그램을 작성하는 것입니다.
예시를 통해 문제를 더 쉽게 이해해 보겠습니다.
입력 : a = 43 ; x = 43 , y = 21 출력 : 21
설명 − a의 초기값은 43이므로, 최종적으로 나머지 값인 21을 반환해야 합니다.
여기서 핵심 제약은 a의 값을 검사할 수 없다는 점입니다. 즉, if문이나 삼항 연산자 같은 조건 판단 로직은 코드에 포함될 수 없습니다. 따라서 조건 없이 두 값을 전환할 수 있는 대안적인 방법을 찾아야 합니다. 실용적이고 구현이 간단한 두 가지 방법을 소개합니다.
방법 1: 산술 연산자 활용
가장 직관적인 방법은 덧셈과 뺄셈(또는 곱셈과 나눗셈)을 조합하는 것입니다. 두 값을 더한 뒤 현재 값을 빼면 자동으로 나머지 값이 남습니다.
공식은 다음과 같습니다.
a = x + y - a 또는 a = x * y / a
다만 곱셈과 나눗셈은 연산 비용이 상대적으로 크고, 0으로 나누는 경우나 오버플로우 등 오류가 발생할 여지가 있으므로, 안전한 덧셈 - 뺄셈 조합을 사용하는 것이 좋습니다.
예제 코드
#include <iostream>
using namespace std;
int main(){
int x = 45;
int y = 5;
int a = x;
cout<<"a의 초기값 : "<<a;
a = x + y - a;
cout<<"\n값 변경 후 a : "<<a;
}실행 결과
a의 초기값 : 45 값 변경 후 a : 5
방법 2: 비트 XOR 연산자 활용
더 효율적인 방법은 비트 단위 XOR(^) 연산자를 사용하는 것입니다. XOR은 같은 값끼리 연산하면 0이 되고, 0과 연산하면 원래 값이 유지되는 성질을 이용합니다.
값은 다음과 같은 방식으로 변경됩니다.
a = x ^ y ^ a;
이 방식은 곱셈·나눗셈처럼 무거운 연산이 없고, 오버플로우 위험도 없어 성능 면에서 유리합니다. 단, 부동소수점 타입에는 적용할 수 없고 정수 타입에만 사용 가능하다는 점에 유의해야 합니다.
예제 코드
#include <iostream>
using namespace std;
int main(){
int x = 56;
int y = 78;
int a = x;
cout<<"a의 초기값 : "<< a;
a = x ^ y ^ a;
cout<<"\n값 변경 후 a : "<<a;
return 0;
}실행 결과
a의 초기값 : 56 값 변경 후 a : 78
마무리
두 방법 모두 조건문 없이 두 값 사이를 전환할 수 있다는 공통점이 있습니다. 가독성과 안전성을 우선한다면 산술 연산 방식을, 성능과 효율을 우선한다면 XOR 연산 방식을 선택하는 것이 좋습니다.