Post

C++ 에서 임시변수 없이 Swap 구현하기 퀴즈

오늘 아는 동생이… 중소기업에 신입 C++ 프로그래머 면접을 봤다고 합니다. 그중에 간단한 코딩테스트도 있었다고 하네요. 그런데 하필… 거기에 임시변수를 사용하지 말고 swap 을 구현하라는 유명한 고전문제가 나왔다고 하네요. 제가 이 문제 내는 사람이 너무 생각없이 내는 경우를 몇번 봐서… 이런 문제 내지 말라는 의미로 공유 해 봅니다.

일반적으로 저런 코드를 짜지 말라고 하는 이유인 성능이 오히려 나쁘다거나, 보기 어렵다는 그런 문제가 아닙니다. 보통 C++에서 swap 을 임시변수를 사용하지 않고 구현하는 경우는 다음3가지 케이스를 답으로 생각하고 문제를 냅니다.

  1. ^ (xor) 을 사용
  2. + - 사용
  3. * / 사용

하지만 이것들은 각각 사용이 불가능한 제한 조건이 있습니다.

  1. 두 아규먼트가 같은 포인터면 무조건 0이 되어 사용할수없습니다. 또한 정수가 아니면 사용할 수 없습니다
  2. 중간 계산값이 type 범위를 벗어나면 잘못된 값이 나올 수 있습니다
  3. 아규먼트에 0이 있으면 Division By Zero 가 발생할 수 있습니다

엣지케이스가 나오지 않도록 하는 아무런 제약 조건을 주지 않고, 단순히 이런 문제를 내는것은, 좋지 않습니다. 아래는 각각의 예외 케이스에 대한 테스트 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <float.h>

void swap(int& a, int& b)
{
	a ^= b;
	b ^= a;
	a ^= b;
}

void swap2(float& c, float& d) {
	c += d;
	d = c - d;
	c = c - d;
}

void swap3(int& a, int& b) {
	a *= b;
	b = a / b;
	a = a / b;
}


void main() 
{
	int a, b;
	a = 5;

	swap(a, a);
	printf("Test1 : %d\n", a);	

	float c = FLT_MAX;
	float d = FLT_MAX;
	printf("Test2-1 : %f %f\n", c, d);
	swap2(c,d);
	printf("Test2-2 : %f %f\n", c, d);

	a = 2000000000;	b = 0;
	swap3(a, b);
	printf("Tset3 : %d %d\n", a, b);	

	printf("Test Complete\n");
}

Image

This post is licensed under CC BY 4.0 by the author.