[백준] JavaScript 3009번 네 번째 점

Noma·2021년 9월 27일
0

Question

[백준] JavaScript 3009번 네 번째 점

input

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

output

직사각형의 네 번째 점의 좌표를 출력한다.

example

5 5
5 7
7 5
7 7

Solution 1

x좌표들과 y좌표들을 따로 배열로 만들어 따로 정의한 함수를 이용해 나머지 한 점의 좌표를 구했다.

const arr=require('fs').readFileSync('/dev/stdin').toString().trim().split(/\s+/).map(Number);
let xArr=arr.filter((v,i)=>i%2===0);
let yArr=arr.filter((v,i)=>i%2!==0);
console.log(getCoord(xArr),getCoord(yArr));

function getCoord(arr){
    return arr[0]===arr[1]?arr[2]:(arr[1]===arr[2]?arr[0]:arr[1]);
}

Solution 2

[30,20,20]과 같은 배열에서 혼자 다른 값인 요소를 찾을 때 XOR 논리 연산자를 사용하면 쉽게 구할 수 있다.

const fs = require('fs');
let X = 0, Y = 0;
fs.readFileSync('/dev/stdin').toString().split('\n').forEach((line) => {
    const [x, y] = line.split(' ').map(Number);
    X ^= x;
    Y ^= y;
})
console.log(X, Y);

codingishard님의 코드

항상 제출을 하고 나서 메모리 및 시간, 코드량이 적절하게 좋은 다른 사람의 답안도 확인해 보는데 XOR로 접근하는 방법이 특이하면서도 간결했어서 기억하고자 정리한다.

What I learned

XOR 논리 연산자(^)

기존에 XOR은 서로 다를 때(1-0, 0-1) 결과가 1이고, 같을 때(0-0, 1-1) 0이라는 것만 알고 있었다.

이때 0과 1이 아닌 다른 숫자들을 이용해 연산하면 어떻게 될까? 직접 해보니 규칙을 알수 없는 숫자가 리턴된다. (50^30=>44)

하지만 이 리턴된 숫자와 연산자로 비교하던 숫자 두 개가 하나의 쌍을 이루어 셋 중 두 개를 연산하면 나머지 하나가 결과 값으로 나오는 걸 여러번 해보니 알 수 있었다.

즉 50과 30을 ^하면 44가 나오는 데 이는 (50,30,44)을 쌍을 이루게 되어 50^30=>44, 30^44=>50, 50^44=>30 이 나오게 된다.

이 원리를 이용해 위의 코드처럼 X^=x 하게 되면 요소들 중 다른 하나의 값을 찾을 수 있다.

profile
Frontend Web/App Engineer

0개의 댓글