[두 원 사이의 정수 쌍] 코딩테스트 연습 > 연습문제 > 두 원 사이의 정수 쌍
※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요 ※
[문제설명]
x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.
제한 사항
- 1 ≤ r1 < r2 ≤ 1,000,000
입출력 예
입출력 예 설명
그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.
[간단설명]
r2 반지름과, r1 반지름으로 원을 그렸을 때, 그 사이의 정수로된 점의 개수를 구하는 문제
[접근방법]
** 원의 방정식 활용( x^2 + y^2 = r^2 -> y = 루트(r^2-x^2))
1. r2의 양의 x좌표 만큼 반복한다.
2. r2의 y좌표 y2, r1의 y좌표 y1을 계산해서, 정수의 개수를 카운트한다.
ㄴ y2는 소수점 버림, y1은 소수점 올림.
3. r2의 양의 x좌표로 구한 점의 개수 곱하기 4 해준다.
[주의사항]
1. 제곱을 구할 때, Math.pow 를 이용하자.
ㄴ i*i 또는 r1*r1, r2*r2 로 계산하면, 자리수 초과로 계산이 올바르지 않다.
2. x 좌표의 범위에 따라 +1을 할지 말지 정해야한다.
ㄴ x좌표가 0~r1까지는 y1이 0이 아니기 때문에, +1을 해주고, r1~r2-1 까지는 r1이 0이하로 되기때문에 +1을 하지 않는다.
[소스공개]
class Solution {
public long solution(int r1, int r2) {
// 정답변수
long sum = 0;
// x좌표 i의 범위 -> 0부터 r2-1 까지
// 나중에 x4 해주기 위해서 r2-1까지 한다
for(int i=0;i<r2;i++){
// x좌표 i가 r1보다 작으면 계산후 + 1 해서 점의 개수를 카운트 한다.
// ex) y2=2.2, y1=1.4이면, 점y는 2이다.
// y2=2, y1=2로 최대값, 최소값 계산해서, +1 한 결과로 점의 개수를 구해준다.
if(i<r1){
sum+= Math.floor(Math.sqrt(Math.pow(r2,2)-Math.pow(i,2))) - Math.ceil(Math.sqrt(Math.pow(r1,2)-Math.pow(i,2)))+1;
}
// x좌표 i가 r1보다 크거나 같으면, y2 좌표만 구하고, + 1 하지 않는다.
// ex) i=2이면, r1=2일때, 2^2 - 2^2 은 0
// i=3이면, r1=2일때, 2^2 - 2^3 은 음수
// 즉, y1이 0이거나 음수이면, y2만 구하면 된다. +1은 필요가 없다.
else{
sum+= Math.floor(Math.sqrt(Math.pow(r2,2)-Math.pow(i,2)));
}
}
// 전체 점의 개수 = 양의 좌표로 계산한 점의 개수 x 4
return sum*4;
}
}
[실행결과]
'코딩 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 과제 진행하기(by 다알쥐AI) (2) | 2024.11.09 |
---|---|
[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 연속된 부분 수열의 합(by 다알쥐AI) (0) | 2024.11.07 |
[프로그래머스/JAVA] PCCE 기출문제 > 9번 >지폐 접기 (by 다알쥐AI) (1) | 2024.11.01 |
[프로그래머스/JAVA] PCCP 기출문제 > 3번 > 충돌위험 찾기 (by 다알쥐AI) (0) | 2024.10.30 |
[프로그래머스/JAVA] PCCP 기출문제 > 2번 > 퍼즐 게임 챌린지 (by 다알쥐AI) (1) | 2024.10.29 |