C++ 에서 임시변수 없이 Swap 구현하기 퀴즈
오늘 아는 동생이… 중소기업에 신입 C++ 프로그래머 면접을 봤다고 합니다. 그중에 간단한 코딩테스트도 있었다고 하네요. 그런데 하필… 거기에 임시변수를 사용하지 말고 swap 을 구현하라는 유명한 고전문제가 나왔다고 하네요. 제가 이 문제 내는 사람이 너무 생각없이 내는 경우를 몇번 봐서… 이런 문제 내지 말라는 의미로 공유 해 봅니다.
일반적으로 저런 코드를 짜지 말라고 하는 이유인 성능이 오히려 나쁘다거나, 보기 어렵다는 그런 문제가 아닙니다. 보통 C++에서 swap 을 임시변수를 사용하지 않고 구현하는 경우는 다음3가지 케이스를 답으로 생각하고 문제를 냅니다.
^
(xor) 을 사용+
-
사용*
/
사용
하지만 이것들은 각각 사용이 불가능한 제한 조건이 있습니다.
- 두 아규먼트가 같은 포인터면 무조건 0이 되어 사용할수없습니다. 또한 정수가 아니면 사용할 수 없습니다
- 중간 계산값이 type 범위를 벗어나면 잘못된 값이 나올 수 있습니다
- 아규먼트에 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");
}
This post is licensed under CC BY 4.0 by the author.