https://school.programmers.co.kr/learn/courses/30/lessons/181187
1. 문제 설명
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.
2. 입출력
3. 문제 풀이
3-1) 피타고라스 활용
- 피타고라스는 직각삼각형일 때 두 변을 활용하여 나머지 한 변의 길이를 알 수 있다.
- 반지름(r)과 x축을 활용하여 원 내부의 점의 개수(y축 길이)를 구할 수 있다.
- 주의할 점은 각 원 위의 점도 포함하기 때문에 r1의 원 위에 있는 점의 개수도 포함시켜야 한다.(r1 = 작은 원, r2 큰 원)
ex)
r1 = 5, x = 3
y = 5^2 - 3^2 = 4^2
* y축의 길이는 4가 나오지만 원 위에 점은 포함하므로 4 - 1 = 3이 된다.
3-2) 코드
큰 원의 반지름(r2)까지 반복하여 x축 각각의 점의 개수 구한다. => 작은 원(r1)도 동일 => 1사분면의 큰 원의 점의 개수 - 작은 원의 점의 개수로 두 원 사이의 점의 개수를 구한다.
function solution(r1, r2) {
var answer = 0;
var r1Y = 0;
// 1) r2의 길이 만큼 반복문
for(let i = 1; i < r2; i++) {
// 2) 큰 원(r2)의 경우 Y축 정수의 길이 만큼 점의 개수를 가지기 때문에 소수점을 버린다.
answer += Math.floor(Math.sqrt(r2**2 - i**2));
// 3) 작은 원(r1)도 동일하게 점의 개수를 구한다.
if(i < r1) {
r1Y = Math.sqrt(r1**2 - i**2);
// 4) 작은 원(r1)의 위에 점이 있는 경우
if(Number.isInteger(r1Y)) {
// 5) 두 점 사이에 있는 점이라고 판단 하므로 r1의 Y축 길이에서 -1
answer -= r1Y - 1;
} else {
// 6) 위에 있지 않으면 Y축 정수 길이 만큼 점의 개수를 가진다.
answer -= Math.floor(r1Y);
}
}
}
// 7) 1사분면의 점의 개수를 구했으면 4를 곱한다.
answer *= 4;
// 8) x축, y축 위에 있는 두 원 사이의 점의 개수 더한다.
answer += (r2 - r1 + 1) * 4;
return answer;
}
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스/JavaScript] Lv.2 과제 진행하기 (0) | 2023.07.27 |
---|---|
[프로그래머스/JavaScript] Lv.2 연속된 부분 수열의 합 (0) | 2023.06.30 |
[프로그래머스/JavaScript] Lv.2 요격 시스템 (0) | 2023.06.06 |
[프로그래머스/JavaScript] Lv.2 광물 캐기 (0) | 2023.04.28 |
[백준 / NodeJS] 1978번 소수 찾기 (0) | 2023.04.27 |