level - hard
[문제 내용]
배열 arr1, arr2가 주어지면 모든 (i, j)에대해 arr1[i] AND arr2[j] 를 하고 그 배열의 모든값을 XOR 한 값을 반환
[example 1]
Input: arr1 = [1,2,3], arr2 = [6,5]
Output: 0
Explanation: The list = [1 AND 6, 1 AND 5, 2 AND 6, 2 AND 5, 3 AND 6, 3 AND 5] = [0,1,2,0,2,1].
The XOR sum = 0 XOR 1 XOR 2 XOR 0 XOR 2 XOR 1 = 0.
[example 2]
Input: arr1 = [12], arr2 = [4]
Output: 4
Explanation: The list = [12 AND 4] = [4]. The XOR sum = 4.
[해결 방법]
난이도는 hard이지만 막상 풀어보면 별거 아니다.
그냥 수학 연산만 잘 할줄 알면 된다.
example 1에 해당하는 배열로 설명을 해보겠다.
배열에 대한 연산식을 나열하면 아래와 같다.
(1 & 6) ^ (1 & 5) ^ (2 & 6) ^ (2 & 5) ^ (3 & 6) ^ (3 & 5)
여기서 묶을 수 있는 것들을 묶어보겠다.
1 & (6 ^ 5) ^ 2 & (6 ^ 5) ^ 3 & (6 ^ 5)
이런식으로 묶을 수 있고, 좀 더 보기 좋게 괄호로 묶어보면,
(1 & (6 ^ 5)) ^ (2 & (6 ^ 5)) ^ (3 & (6 ^ 5))
다시 최종적으로 묶어보면!
(1 ^ 2 ^ 3) & (6 ^ 5)
최종적으로, arr1과 arr2에 대한 값들을 모두 XOR 연산한후
각 연산한 값을 다시 AND 해주면 된다.
위의 내용을 코드로 작성하면,
아래와 같다.
class Solution {
public int getXORSum(int[] arr1, int[] arr2) {
int ar1 = arr1[0];
for(int i=1; i<arr1.length; i++) {
ar1 ^= arr1[i];
}
int ar2 = arr2[0];
for(int i=1; i<arr2.length; i++) {
ar2 ^= arr2[i];
}
return ar1 & ar2;
}
}