코딩테스트를 회고하던 중, 더 효율적인 문제풀이 방식이 있지 않은 마음에 구글링을 해봤다.
단순히 나처럼 경우에 따라서 if-else if
문으로 처리한 경우 외에도 XOR^
을 사용하는 방법을 확인 할 수 있었다.
너무나도 코드가 간결해지기에 vscode에서 여러가지 시도를 해봤다.
초반에 검색한 바에 따르면 아래와 같다:
a ^ b
의 경우, a와 b가 다르면 1을 리턴하고, 같으면 0을 리턴한다.a ^ b ^ c
의 경우, 세 값 중 두 개가 같고 나머지 하나가 다를 경우 그 다른 값을 반환한다.let a = 1;
let b = 2;
let c = 3;
let result = a ^ b ^ c;
console.log(result); // 0
혹은,
let a = 1;
let b = 5;
let c = 6;
let result = a ^ b ^ c;
console.log(result); // 2
let a = 1;
let b = 1;
let c = 3;
let result = a ^ b ^ c;
console.log(result); // 3
let a = 1;
let b = 1;
let c = 1;
let result = a ^ b ^ c;
console.log(result); // 1
가지각색 이다. 이해가 되지 않는다.
'0과 1로만 나와야 하는것 아닌가?' 하는 의문이 들었다.
MDN 서칭을 진행한 결과 답을 얻을 수 있었다.
The operands are converted to 32-bit integers and expressed by a series of bits (zeroes and ones).
...
Each bit in the first operand is paired with the corresponding bit in the second operand: first bit to first bit, second bit to second bit, and so on.
MDN에서 제시하는 예시를 보면 이해가 쉽다:
const a = 5; // 00000000000000000000000000000101
const b = 3; // 00000000000000000000000000000011
console.log(a ^ b); // 00000000000000000000000000000110
// Expected output: 6
즉,
1. 피연산자를 32비트로 전환
2. 각각의 비트를 비교 대조하며 다르면 1, 같으면 0을 그 자리수에 갖는 32비트를 만든다.
(위의 예시에서는 a(5)의 첫번째 자리비트와 b(3)의 첫번째 자리비트 비교하고 -> 두번째 자리비트 -> ...)
이에 위의 예시에서의 끝 세자리만 확인해보면:
101
011
⬇️
110
이와 같이 각 자리수를 대조하여 새로운 32비트를 구성하는 0과 1을 생성한 것이 확인된다.
이러니 값이 다 가지각색으로 나오지!
깨달은 점: (1) 공식문서 보자 (2) 따라쓰지 말고 알고쓰자