✔ 두 원 사이의 정수 쌍
문제 분석하기
1, 2, 3, 4분면의 공간에 다 같은 점의 개수가 존재하게 되므로 한 분면의 개수를 구하여 4만큼 반환하도록 함
이때 작은 원의 올림만큼, 큰 원의 내림만큼 점이 존재할 수 있으므로 이를 이용
손으로 풀어보기
- 작은 원의 올림만큼, 큰 원의 내림만큼 점이 존재할 수 있으므로 이를 이용해 한 분면의 개수를 구함
- 한 분면의 4배를 반환
슈도코드 작성하기
r1, r2(반지름)
answer(두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수)
for(x -> 1부터 r2까지) {
minY(x에 대한 최소 Y 값) = Math.sqrt(1.0 * r1 * r1 - 1.0 * x * x)의 올림 값
maxY(x에 대한 최대 Y 값) = Math.sqrt(1.0 * r2 * r2 - 1.0 * x * x)의 내림 값
answer += (maxY - minY + 1)
}
answer * 4 반환
코드 구현하기
/**
* 181187) 두_원_사이의_정수_쌍
*/
public class L104_181187 {
// r1, r2(반지름)
public long solution(int r1, int r2) {
// answer(두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수)
long answer = 0;
// (1, 0)부터 (r2, 0)까지
for (int x = 1; x <= r2; x++) {
// minY(x에 대한 점의 최소 Y 값) - r1과 r2 사이에 있을 수 있으므로 올림 값
long minY = (long) Math.ceil(Math.sqrt(1.0 * r1 * r1 - 1.0 * x * x));
// maxY(x에 대한 점의 최대 Y 값) - r1과 r2 사이에 있을 수 있으므로 내림 값
long maxY = (long) Math.floor(Math.sqrt(1.0 * r2 * r2 - 1.0 * x * x));
// maxY와 minY 사이에 있는 점의 개수를 추가
answer += (maxY - minY + 1);
}
// 한 분면의 4배를 반환
return answer * 4;
}
// 테스트 케이스
public static void main(String[] args) {
L104_181187 solution = new L104_181187();
int r1 = 2;
int r2 = 3;
long result = solution.solution(r1, r2);
System.out.println(result);
}
}
'Coding Test > Java 알고리즘 실전' 카테고리의 다른 글
[250135] 아날로그 시계 (0) | 2024.02.21 |
---|---|
[181188] 요격 시스템 (0) | 2024.02.20 |
[178870] 연속된 부분 수열의 합 (0) | 2024.02.19 |
[176962] 과제 진행하기 (0) | 2024.02.18 |
[172927] 광물 캐기 (0) | 2024.02.16 |