본문 바로가기
알고리즘

[프로그래머스 lv2] 두 원 사이의 정수 쌍 [JS]

by limew 2023. 12. 27.

https://school.programmers.co.kr/learn/courses/30/lessons/181187

 

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


제한 사항

  • 1 ≤ r1 < r2 ≤ 1,000,000

 


 

 

나의 풀이

  • 원의 4분의1 안의 점 갯수를 구한 뒤 \* 4를 리턴한다
  • x = 0인 부분은 겹치므로 x = 1부터 x <= r2때까지 순회한다
  • 순회하면서 원 그래프 식을 사용하여 각 x마다 가능한 최대, 최소y를 구해 가능한 y의 갯수를 구한다.
  • 앞서 구한 갯수 \*4 리턴한다.

 

x제곱 + y제곱 = 반지름 제곱 식을 사용할 수 있다

 

예외경우는 x가 r1보다 클 때 minY는 0이다

 

 

function solution(r1, r2) {
    var answer = 0;
    const r1Pow = r1*r1;
    const r2Pow = r2*r2;
    
    for (let x = 1; x <= r2; x++) {
        const currPow = x*x;
        const maxY = Math.floor(Math.sqrt(r2Pow - currPow));
        const minY = x <= r1 ? Math.ceil(Math.sqrt(r1Pow - currPow)) : 0;
        answer += maxY - minY + 1;
    }
    return answer*4;
}