코딩테스트를 보기 위한 데모테스트를 진행했다.
직사각형을 만들기 위한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하는 문제이다.
v | result |
---|---|
[[1,4],[3,4],[3,10]] | [1,10] |
[[1,1],[2,2],[1,2]] | [2,1] |
위와 같이 2차원 배열의 3개의 값을 이용해 나머지 한 점을 구하면 된다.
직사각형을 만들기 위해선 직선이 필요하다. 이 말이 무엇이냐면 x와 y의 좌표 값은 두 개씩 중복된다.
[[1,4],[3,4],[3,10]] 을 보면 x값 3이 2개이고 y값 4가 2개이다. 그렇다면 하나씩 남은 1과 10을 이용해서 답을 구할 수 있다. [1,10]
풀이를 토대로 하드코딩을 해보자면,
// x좌표 구하기
if(v[0][0] == v[1][0]) { // 첫번째 x좌표와 두번째 x좌표가 같을 경우 세번째 x좌표값이 구하고자 하는 x좌표값이 된다.
answer[0] = v[2][0];
} else if (v[0][0] == v[2][0]) { // 첫번째 x좌표와 세번째 x좌표가 같을 경우 두번째 x좌표값이 구하고자 하는 x좌표값이 된다.
answer[0] = v[1][0];
} else if (v[1][0] == v[2][0]) { // 두번째 x좌표와 세번째 x좌표가 같을 경우 첫번째 x좌표값이 구하고자 하는 x좌표값이 된다.
answer[0] = v[0][0]
}
// y좌표 구하기
if(v[0][1] == v[1][1]){ // 첫번째 y좌표와 두번째 y좌표가 같을 경우 세번째 y좌표값이 구하고자 하는 y좌표값이 된다.
answer[1] = v[2][1];
} else if (v[0][1] == v[2][1]){ // 첫번째 y좌표와 세번째 y좌표가 같을 경우 두번째 y좌표값이 구하고자 하는 y좌표값이 된다.
answer[1] = v[1][1];
} else if (v[1][1] == v[2][1]){ // 두번째 y좌표와 세번째 y좌표가 같을 경우 첫번째 y좌표값이 구하고자 하는 y좌표값이 된다.
answer[1] = v[0][1];
}
반복문을 사용해보자.
// i가 0일 때 = x좌표, i가 1일 때 = y좌표
for(let i=0; i<answer.length; i++){
if(v[0][i] == v[1][i]){
answer[i] = v[2][i];
} else if(v[0][i] == v[2][i]){
answer[i] = v[1][i];
} else if(v[1][i] == v[2][i]){
answer[i] = v[0][i];
}
}
이렇게 해도 답이 되지만, 찾아보니 좋은 방법을 하나 찾았다.
논리연산자 XOR(^)을 사용하는 방법이다.
XOR 연산자는 서로 값이 다를 때 참을 반환하고, 값이 같다면 거짓을 반환한다.
answer[0] = v[0][0] ^ v[1][0] ^ v[2][0];
answer[1] = v[0][1] ^ v[1][1] ^ v[2][1];
return answer;
쉽게 설명하자면, 세 값 중 두 개가 같고 나머지 하나가 다를 경우 그 다른 값을 반환한다고 생각하면 된다.
위와 같이 논리연산자를 사용하여 코드를 짜면 엄청 간결해지고, 시간도 단축되는 것을 볼 수 있다.
문제의 규칙만 찾으면 쉽게 풀 수 있는 문제였다. (그 규칙을 찾는게 아직은 어렵지만..) 규칙을 찾은 후 처음엔 for문을 돌려 풀면 되겠다! 라고 생각해 풀었지만, 더 나은 풀이를 찾다가 발견한 논리연산자를 사용함으로써 드라마틱한 코드 변화를 보고 오늘도 또 하나 배워간다!