[프로그래머스, 데모테스트] 직사각형 좌표 구하기 - Javascript

devmin24·2021년 7월 30일
3

⏳ 도전! 알고리즘

목록 보기
18/32
post-thumbnail

문제 링크

코딩테스트를 보기 위한 데모테스트를 진행했다.

문제

직사각형을 만들기 위한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 구하는 문제이다.

입출력 예

vresult
[[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;

쉽게 설명하자면, 세 값 중 두 개가 같고 나머지 하나가 다를 경우 그 다른 값을 반환한다고 생각하면 된다.
위와 같이 논리연산자를 사용하여 코드를 짜면 엄청 간결해지고, 시간도 단축되는 것을 볼 수 있다.

Takeaway

문제의 규칙만 찾으면 쉽게 풀 수 있는 문제였다. (그 규칙을 찾는게 아직은 어렵지만..) 규칙을 찾은 후 처음엔 for문을 돌려 풀면 되겠다! 라고 생각해 풀었지만, 더 나은 풀이를 찾다가 발견한 논리연산자를 사용함으로써 드라마틱한 코드 변화를 보고 오늘도 또 하나 배워간다!

profile
꾸준함, 열정 한 가득 챙겨 끝없는 목표를 향해 달려가는 개발자👩‍💻

0개의 댓글