문제설명
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.
제한 사항
- 1 ≤ r1 < r2 ≤ 1,000,000
입출력 예
r1 | r2 | result |
2 | 3 | 20 |
입출력 예 설명
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.
나의 풀이
function solution(r1, r2) {
let answer = 0
for(let i = 1 ; i<=r2 ; i++){
let max = Math.floor(Math.sqrt(r2**2-i**2))
let min = i>=r1 ? 0 : Math.ceil(Math.sqrt(r1**2-i**2))
answer += max - min + 1
}
return answer * 4
}
풀이 전략
제 1사분면의 점의 개수만 구해서 1사분면의 점의 개수 * 4를 하면 더 효율적이므로 위의 코드는 1사분면에 해당하는 점의 개수만 구했다.
1. x^2 + y^2 =r^2 식을 이용하여 y좌표의 최댓값인 max와 y좌표의 최솟값인 min을 구한다. 이때, 정수에 해당하는 좌표만 구할 것이므로 최댓값은 floor를 통해 내림해주고, 최솟값은 ceil을 통해 올림해준다.
2. min의 경우 (x좌표,0) 즉, x축 위에 있는 값도 구해줄 것이기 때문에 현재 좌표인 i가 r1 보다 크다면 최솟값은 무조건 0을 대입해준다.
--> 이때, y축 위의 값은 따로 고려하지 않는 이유 :
현재 1사분면 값만 구하고 있기 때문에 나중에 4를 곱할 때 개수가 중복되지 않게 하기 위함
3. y의 최댓값에서 y의 최솟값 +1 을 해주면 해당 x좌표에 두 원 사이의 정수 값이 나온다.
4. x 좌표가 r2이하일때까지 순회하여 answer 에 누적해서 더한다.
5. 반복문이 끝나면 제 1사분면의 값만 구한 것이므로 answer*4를 return