TODAY : / TOTAL :

[ Java ] SWAP 함수 구현하기

  • Share this:
반응형

Java를 구현하다가 SWAP을 쓰게 되었는데. . .
생각해보니 이게 C에서 쓰던 포인터를 읽는 방식으론 안되더라구요.
이것저것 알아보다가 만든 것들입니다.
Java를 공부하시는 여러분들이 더 잘 아실듯. . .


ㅁ 배열과 인덱스를 이용한 SWAP

간단하므로 패스.

// array : 배열의 이름
// index1 , index2 : 서로 바꿀 데이터가 존재하는 배열의 인덱스

void Swap(int[] array, int index1, int index2) {
   int iTemp;
   iTemp = array[index1];
   array[index1] = array[index2];
   array[index2] = iTemp;
}


ㅁ 비트연산자를 이용한 SWAP


int a = 10;
int b = 20;

Swap -> a , b
a = a ^ b;   - 1
b = a ^ b;   - 2
a = a ^ b;   - 3


다음과 같이 a = 10  b = 20 이라는 데이터가 있다고 칩시다.
10이라는 숫자는  2진수로 변경하면    1010  입니다.
20이라는 숫자는  2진수로 변경하면  10100  입니다.

얘데 둘을 ^ (논리연산자)를 이용하여, 계산합니다.
( 논리 연산자는 Boolean 타입에서 사용되지만, 이렇게 응용하면 되긴... 합니다 ㅋ )
단, 이 방법은 비트연산을 이용한 방법으로, 정수를 변경할 때만 사용할 수 있습니다.
다른 자료형에선 원하는 결과를 얻을수 없다는 거죠.


일단 계산을 해보면. . .

a = a ^ b;
00001010    -> a
00010100    -> b
ㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00011110   ->  a 에 대입.

1번식의 결과 (2진수 값)
a = 30  ( 00011110 )   b = 20 ( 00010100 )
a에 완전 엉뚱한 수가 들어가버렸습니다. 하지만 너무 걱정하지말고, 계속 진행합니다.

다음.. 2번처럼, 계산 합니다.
b = a ^ b;
00011110 -> a
00010100 -> b
ㅡㅡㅡㅡㅡㅡㅡㅡ
00001010 -> b 에 대입.

2번식의 결과 (2진수 값)
a = 30 ( 00011110 ) b = 10 ( 00001010 )
b 에 원래 a의 값이 들어간걸 볼수 있습니다!!  하지만 a는...

마지막 3번처럼 계산.
a = a ^ b;
00011110  -> a
00001010  -> b
ㅡㅡㅡㅡㅡㅡㅡㅡ
00010100  ->  a 에 대입

3번식의 결과 (2진수 값)
a = 20 ( 00010100 ) b = 10 ( 00001010 )  

우리가 원하던대로 SWAP 연산이 됨을 알 수 있습니다.
임시변수 선언 하나 없이 비트연산을 이용하여 빠르게 SWAP을 할수 있는 방법입니다.



ㅁ 참고
ArrayList 를 이용한 SWAP 기능 구현


반응형

SEARCH

태그로 찾아보기