
-Code
class Solution {
public long solution(int r1, int r2) {
// 작은 원은 올림과 큰원의 내림 처리로 갯수 차 구하기
long answer = 0;
// 1부터 시작하는 경우는 y축 위에 좌표들이 *4할때,
// 중복되어 곱해지므로 제외
for (int x = 1; x <= r2 ; x++) {
// r1보다 작은 경우에만 값 존재
// 작은 원은 올림을 하여도 가능 범위 보다 작아 존재할 수있으므로 사용
double maxY1 = x <= r1 ? getMaxY(x, r1) : 0;
// 큰 원 내림은 올림할경우 큰원을 넘어선 좌표가 나오기 때문에 사용
double maxY2 = getMaxY(x, r2);
// +1을 하면서 y축 위의 좌표의 갯수 보정
answer += (long) (Math.floor(maxY2) - Math.ceil(maxY1) + 1) ;
}
// 한 사분면의 갯수이므로 4를 곱해 전채 갯수 구하기
return answer * 4;
}
// 해당 x축에서 존재할 수 있는 최대 Y좌표 구하기
private static double getMaxY(long x, long r) {
long sqrtGap = (r * r) - (x * x);
return Math.sqrt(sqrtGap);
}
}
처음에 단순히 두 원의 반지름 차이나 넓이 비율로 계산할 수 있을 줄 알았으나 코드를 작성하다가 이상해서 찾아보니 불가능하고 각 X축에서 최대 Y를 구하면 해당 위치에서 나오는 전체 좌표 값이 나오는 문제였습니다.
그래서 최대 Y를 구하는 공식으로 계산을 했으나 범위가 너무 넓어서 long으로 계산하여 루트를 씌워 double로 바꿔줘야 했고습니다. 추가적으로 X가 0인 경우를 포함하게 되면 중복되어 좌표 갯수가 더 많이 나와 틀리기도 했습니다. 이부분은 찾아보니 X가 0인 부분을 제외하고 1을 더하여 갯수를 보정해 주면 된다는 것을 보고 수정하여 해결했습니다.
'알고리즘 문제 > Java' 카테고리의 다른 글
| [프로그래머스/Java] 두 큐 합 같게 만들기 (0) | 2026.05.12 |
|---|---|
| [프로그래머스/Java] 3 x n 타일링 (0) | 2026.05.11 |
| [프로그래머스/Java] 점 찍기 (0) | 2026.05.09 |
| [프로그래머스/Java] 과제 진행하기 (0) | 2026.05.08 |
| [프로그래머스/Java] 미로 탈출 (0) | 2026.05.07 |