오늘 뭐했냐/기억하면 좋을 문제들

사분면 위치 구하기 (구조분해할당)

스스로에게 2023. 5. 26. 17:20

사분면은 한 평면을 x축과 y축을 기준으로 나눈 네 부분입니다.

사분면은 아래와 같이 1부터 4까지 번호를매깁니다.

x 좌표와 y 좌표가 모두 양수이면 제1사분면에 속합니다. 

x 좌표가 음수, y 좌표가 양수이면 제2사분면에 속합니다. 

x 좌표와 y 좌표가 모두 음수이면 제3사분면에 속합니다.

x 좌표가 양수, y 좌표가 음수이면 제4사분면에 속합니다. 

문제링크https://school.programmers.co.kr/learn/courses/30/lessons/120841

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

function solution(dot) {
    var answer = 0;
    if( (Math.sign(dot[0]) === 1) && (Math.sign(dot[1]) === 1) ) {
        answer = 1
    } else if ( (Math.sign(dot[0]) === -1) && (Math.sign(dot[1]) === 1) ){
        answer = 2
    } else if ( (Math.sign(dot[0]) === -1) && (Math.sign(dot[1]) === -1) ){
        answer = 3
    } else if ( (Math.sign(dot[0]) === 1) && (Math.sign(dot[1]) === -1) ){
        answer = 4
    return answer;
}

내가 풀었던 답안이다 음수 양수 구분을 위해 Math.sign()을 사용했는데 오히려 메서드를 사용해서 코드가 지저분해졌다

function solution(dot) {
    if (dot[0] > 0){
        return dot[1] > 0 ? 1 : 4;
        } else {
        return dot[1] > 0 ? 2 : 3;
        }
    }

삼항연산자와 0을 통한 음수 양수 구분을 하면 코드가 훨씬 간결해진다 삼항연산자를 중첩하면 더 짧아지겠지만 그러면 가독성이 떨어지기에 이정도가 좋아보인다

function solution(dot) {
    const [num,num2] = dot;
    const check = num * num2 > 0;
    return num > 0 ? (check ? 1 : 4) : (check ? 3 : 2);
}

이게 이 문제를 따로 정리하는 이유이다 

배열로 주어진 매개변수를 구조 분해 할당을 통해 하나씩 구분해 주었으며

이를 통해 배열 내부에 요소들 간 계산이 가능해졌다 물론 dot[0] * dot[1]로 할 수 있지만 

코드가 한 두 줄 늘어나도 알아보기 쉬운 코드가 더 좋지 않을까 생각한다

구조분해할당을 왜 써야할까 어떻게 써야할까 몰랐는데 이렇게 쓸 수 있구나 알게 되었다 

그리고 삼항연산자가 중첩되어있긴 하지만 ()를 통해 구분해주었기에 한 번 중첩까진 괜찮을 것 같다