C 언어에서 변수 교환 방법 3가지

프로그래밍을 하다 보면 두 변수의 값을 서로 교환해야 하는 상황이 빈번하게 발생한다. 가장 일반적인 방법은 임시 변수를 사용하는 것이지만, 면접이나 코딩 테스트에서 임시 변수 없이 값을 교환하는 방법을 물어보는 경우도 많다. 본 글에서는 C 언어를 기준으로 변수 교환의 세 가지 방법을 살펴보도록 한다.

1. 임시 변수 방식 (Three-Variable Method)

가장 기본적이고 직관적인 방법이다. 빈 容기에酱油와 식초를 넣는 비유로 설명할 수 있다.酱油를 빈 容기에 담고, 식초를酱油瓶에 넣고, 마지막으로 빈 容기에 있던酱油를 식초瓶에 넣는 과정과 동일하다.

예제 문제:

두 정수 a와 b를 입력받아 값을 교환한 후 출력하시오.

입력 예시:

824 16

출력 예시:

16 824

구현 코드:

#include <stdio.h>
int main()
{
    int x, y, temp;
    scanf("%d%d", &x, &y);
    temp = x;
    x = y;
    y = temp;
    printf("%d %d\n", x, y);
    return 0;
}

실행 결과:

824 16
16 824

이 방법은 어떤 상황에서든 안정적으로 동작하며, 이해하기 직관적이고 가장 널리 사용되는 방식이다.

2. 산술 연산 방식 (Addition/Subtraction Method)

임시 변수를 사용하지 않고 +, - 연산자로 값을 교환하는 방법이다. 다만, 오버플로우 문제가 발생할 수 있어 실제 프로젝트에서는 잘 사용하지 않는다.

예제: a = 3, b = 5를 교환하는 경우

구현 코드:

#include <stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    a = a + b;  // a = 8
    b = a - b;  // b = 3
    a = a - b;  // a = 5
    printf("%d %d", a, b);
    return 0;
}

실행 결과:

5 3

동작 원리:

  • 초기값: a = 3, b = 5
  • a = a + b 실행 후: a = 8, b = 5
  • b = a - b 실행 후: a = 8, b = 3
  • a = a - b 실행 후: a = 5, b = 3

이 방식은 임시 변수를 하나도 사용하지 않지만, 두数の 합이 int 범위를 초과할 경우 오버플로우가 발생하여 잘못된 결과가 반환될 수 있다. 따라서 특수한 상황에서만 제한적으로 사용해야 한다.

3. 비트 연산 XOR 방식

비트 단위의 논리 연산자 XOR(^)를 활용하여 임시 변수 없이 값을 교환하는 방법이다. C 언어에서 int형은 32비트(4바이트)로 저장되며, XOR 연산은 같은 비트는 0, 다른 비트는 1을 반환한다.

구현 코드:

#include <stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("%d %d", a, b);
    return 0;
}

실행 결과:

5 3

32비트 이진수로 단계별 변화 확인:

a (3)  : 00000000 00000000 00000000 00000011
b (5)  : 00000000 00000000 00000000 00000101

a = a ^ b:
a       : 00000000 00000000 00000000 00000110 (6)
b       : 00000000 00000000 00000000 00000101 (5)

b = a ^ b:
a       : 00000000 00000000 00000000 00000110 (6)
b       : 00000000 00000000 00000000 00000011 (3)

a = a ^ b:
a       : 00000000 00000000 00000000 00000101 (5)
b       : 00000000 00000000 00000000 00000011 (3)

XOR 연산의 핵심 특성:

  • a ^ a = 0 (같은 값의 XOR은 0)
  • a ^ 0 = a (0과의 XOR은 자기 자신)
  • 결합 법칙 성립: (a ^ b) ^ c = a ^ (b ^ c)

그러나 동일한 변수에 대해 self XOR(a ^ a)을 수행하면 0이 되므로, 두 변수가 같은 메모리 주소를 참조할 경우 값이 0이 되어버리는 문제가 발생할 수 있다.

결론

실제 개발에서는 가독성과 안정성을 위해 1번째 방식(임시 변수)을 사용하는 것이 가장 좋다. 2번과 3번째 방법은 알고리즘 문제나 면접에서 "임시 변수 없이 구현해보라"는 요구사항에 대비하여 알고 있으면 유용하다. 특히 XOR 방식은 메모리 사용량을 줄일 수 있다는 장점이 있지만, 코드의 가독성이 떨어지고 엣지 케이스에서 버그가 발생할 수 있어 주의가 필요하다.

태그: C 변수교환 알고리즘 XOR 비트연산

7월 23일 11:44에 게시됨