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

C 언어로 임시 변수 없이 두 배열 교환하기 – 산술 연산자와 비트 연산자 활용법

C 프로그래밍에서 두 배열의 내용을 서로 맞바꾸는(swap) 작업은 흔히 세 번째 임시 변수(temp)를 사용해 처리합니다. 하지만 임시 변수 없이도 산술 연산자비트 연산자만으로 동일한 결과를 얻을 수 있습니다. 이 글에서는 그 원리와 실제 구현 방법을 단계별로 살펴보겠습니다.

핵심 아이디어: 덧셈과 뺄셈으로 값 맞바꾸기

임시 변수 없이 두 값을 교환하는 가장 기본적인 방법은 다음 세 단계입니다.

a = a + b;  // a에 b를 더해 합계 저장
b = a - b;  // 합계에서 b를 빼면 원래 a가 됨
a = a - b;  // 합계에서 새로운 b(원래 a)를 빼면 원래 b가 됨

이 논리를 배열의 각 요소에 반복 적용하면 두 배열 전체를 교환할 수 있습니다.

배열 입력 받기

첫 번째 배열 읽기

printf("enter first array ele:\n");
for(i = 0; i < size; i++){
    scanf("%d", &first[i]);
}

두 번째 배열 읽기

printf("enter second array ele:\n");
for(i = 0; i < size; i++){
    scanf("%d", &sec[i]);
}

임시 변수 없이 두 배열 교환하기

각 인덱스마다 위에서 설명한 덧셈·뺄셈 방식을 적용합니다.

for(i = 0; i < size; i++){
    first[i] = first[i] + sec[i];
    sec[i]   = first[i] - sec[i];
    first[i] = first[i] - sec[i];
}

전체 C 프로그램

다음은 임시 변수 없이 두 배열을 교환하는 완전한 C 프로그램입니다.

#include<stdio.h>
int main(){
    int size, i, first[20], sec[20];
    printf("enter the size of array:");
    scanf("%d", &size);
    printf("enter first array ele:\n");
    for(i = 0; i < size; i++){
        scanf("%d", &first[i]);
    }
    printf("enter second array ele:\n");
    for(i = 0; i < size; i++){
        scanf("%d", &sec[i]);
    }
    // 두 배열 교환
    for(i = 0; i < size; i++){
        first[i] = first[i] + sec[i];
        sec[i]   = first[i] - sec[i];
        first[i] = first[i] - sec[i];
    }
    printf("\n first array after swapping %d elements\n", size);
    for(i = 0; i < size; i++){
        printf(" %d \t ", first[i]);
    }
    printf("\nsec array after Swapping %d elements\n", size);
    for(i = 0; i < size; i++){
        printf(" %d \t ", sec[i]);
    }
    return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

enter the size of array:5
enter first array ele:
11 12 13 14 15
enter second array ele:
90 80 70 60 50
first array after swapping 5 elements
90 80 70 60 50
sec array after Swapping 5 elements
11 12 13 14 15

출력을 보면 첫 번째 배열과 두 번째 배열의 내용이 성공적으로 서로 바뀐 것을 확인할 수 있습니다.

대안: XOR 비트 연산자 사용하기

산술 연산 대신 XOR(^) 비트 연산자를 사용할 수도 있습니다. XOR 방식은 오버플로우 위험이 없다는 장점이 있습니다.

for(i = 0; i < size; i++){
    first[i] = first[i] ^ sec[i];
    sec[i]   = first[i] ^ sec[i];
    first[i] = first[i] ^ sec[i];
}

주의 사항

  • 덧셈·뺄셈 방식: 두 값의 합이 정수형 범위(int)를 초과하면 오버플로우가 발생할 수 있으므로 주의해야 합니다.
  • XOR 방식: 오버플로우는 없지만, 같은 메모리 위치의 변수에 자기 자신과 XOR하면 0이 되므로 포인터로 접근할 때는 주의가 필요합니다.
  • 실무 코드에서는 가독성과 안정성을 위해 임시 변수를 사용하는 것이 일반적이며, 본 기법은 면접 문제나 학습 목적으로 유용합니다.