[Programmers] 두 원 사이의 정수 쌍 - JavaScript

Joosi_Cool·2023년 5월 9일
0

Programmers

목록 보기
85/98
post-thumbnail

문제설명

x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.


제한 사항
  • 1 ≤ r1 < r2 ≤ 1,000,000

입출력 예
r1 r2 result
2 3 20

입출력 예 설명

입출력 예 설명.png
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges



설계 과정

  • 이번 문제는 그림에 나와있는 점에 어떤 기준으로 찍혀있는지 봐보자.
    또한 아래 과정은 제 1사분면 만을 구한다. 나머지 사분면들도 똑같기 때문에 이후에 *4를 해주기 위함이다.
    1부터 r2까지 돌면서 아래과정 시행 (값은 x로)
  1. x 기준에서 r2만큼 떨어진 y좌표를 구함 -> 이 좌표는 내림이 되어야 한다. -> 큰 값은 쓰지 않기 때문
  2. x 기준에서 r1만큼 떨어진 y좌표를 구함 -> 이 좌표는 올림이 되어야 한다. -> 작은 값은 쓰지 않기 때문
    -> 이것은 만약 r1의 길이를 넘어서는 경우가 있는데 이때는 0으로 해준다.
  3. 마지막에 answer+= (두개 구한 값의 차) +1;
  4. 순회를 다했다면 answer*4를 리턴


정답 코드

function solution(r1, r2) {
    var answer = 0;
    for(var x = 1;x<=r2;x++){
        var maxY = Math.floor(Math.sqrt(r2**2 - x**2));
        if(r1>x){
            var minY = Math.ceil(Math.sqrt(r1**2 - x**2));
        }
        else{
            var minY = 0;
        }
        answer+= (maxY - minY + 1);
    }
    return answer*4;
}


결과

이번 문제에 핵심은 O(n)타임으로 끝내는 것이다. 사실 구현하기 쉬운 방법으로 모든점에 대해 거리를 구하면 답은 나오겠지만 2단계인 만큼 시간복잡도를 효율적으로 구현하는 코드가 필요하다.



profile
집돌이 FE개발자의 노트

0개의 댓글