문제
제한사항과 그 예
풀이 방식
- x^2 + y^2 = r^2 을 이용한다.
- 모든 값은 제 1사분면, 2사분면 3사분면, 4사분면 다 동일하다. 제 1사분면 값만 구해서 4배를 하는 것이 편하다.
(단 x축과 y축에 겹치는 점은 4배를 하면 안된다.제외.)
- 작은 원과 큰 원간의 x축 값을 하나씩 확인하면서 큰 원의 y값과 작은 원의 y값을 확인해야함.
import java.util.*;
class Solution {
public long solution(int r1, int r2) {
long answer = 0;
double r1pow = Math.pow(r1, 2); //작은 원의 반지름 제곱
double r2pow = Math.pow(r2, 2); //큰 원의 반지를 제곱.
int onLine = (r2 - r1 + 1)*4; //선 위에 있는 좌표 개수
for(int i=0; i<= r2; i++){ //1사분면만 계산 x축 기준.
double xpow = Math.pow(i, 2);
//작은원의 x값에대한 내부 점 구함.
if(i > r1) r1pow = 0;
double y1 =0; //y값을 0.
if(r1pow != 0){//
y1 = Math.sqrt(r1pow - xpow); //작은원
if(y1 > Math.floor(y1)){
y1 = Math.ceil(y1);//올림
}
}
//큰 원의 x값에대한 내부 점 구함.
double y2 = Math.sqrt(r2pow - xpow); //큰원
if(y2 > Math.floor(y2)){
y2 = Math.floor(y2);//내림
}
//x축에 대한 큰 원의 값과 작은 원의 갯수를 제외.
answer += (int)y2 - (int)y1 + 1;
}
return answer*4 - onLine; //중복 계산된 점 빼주기
}
}