Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 조건문 없이 두 값 중 다른 값으로 변수 변경하기


문제 정의

조건 연산자(if, 삼항 연산자 등)를 사용하지 않고, 변수에 두 개의 후보 값 중 현재 값이 아닌 다른 값을 할당하는 것이 이번 글의 목표입니다.

문제 설명

변수 a는 두 변수 xy 중 하나의 값을 가지고 있습니다. 우리가 해야 할 일은 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 연산 방식을 선택하는 것이 좋습니다.