int[] arr =newint[]{1,2,1,3,3,2,4};
위와 같은 정수형 배열에서 중복되지 않는 4의 값을 가져오고 싶을 때,
1차원 배열에서 중복되지 않는 정수를 찾기 위해서는 XOR 연산이 필요하다.
| 명제 P | 명제 Q | P ⊻ Q |
|---|---|---|
| 1 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
[XOR 진리표]
XOR의 연산 과정을 살펴보면, 다음과 같다.
| 1 | 2 | 1 | 3 | 3 | 2 | 4 |
|---|---|---|---|---|---|---|
| 000**(0)001(1)** | 001**(1)010(2)** | 011**(3)001(1)** | 010**(2)001(1)** | 011**(3)001(1)** | 010**(2)010(2)** | 000**(0)100(4)** |
| 001**(1)** | 011**(3)** | 010**(2)** | 011**(3)** | 010**(2)** | 000**(0)** | 100**(4)** |
[연산 과정]
int[] arr =newint[]{1,2,1,3,3,2,4};
int result=0;
for(int i = 0 ; i < arr.length ; ++i) {
result ^= arr[i];
}
System.out.println("result = " + result);
결과 값 : 4
하지만, 이 방법으로는 짝이 맞지 않는 숫자가 단 하나만 존재한다는 가정이 있기에 가능한 것이지, 2개 이상을 찾기 위해서는 사용이 불가능하다.
그래서 짝지 맞지 않는 정수를 찾기 위해 Set을 이용해서 중복값이 발견되면 지울 수 있도록 하였다.
int[] arr =newint[]{1,2,1,3,3,2,4,5};
Set<Integer> dup =newHashSet<>();
Set<Integer> noDup =newHashSet<>();
for (int i = 0 ; i < arr.length ; ++i) {
if (dup.contains(arr[i])) {
noDup.remove(arr[i]);
}else {
noDup.add(arr[i]);
}
dup.add(arr[i]);
}
System.out.println("noDup = " + noDup);
결과 값 : [4, 5]