프로그래머스 두 원 사이의 정수

오늘도 코딩중!·2023년 9월 6일
0

프로그래머스

목록 보기
6/7

문제

제한사항과 그 예

풀이 방식

  1. x^2 + y^2 = r^2 을 이용한다.
  2. 모든 값은 제 1사분면, 2사분면 3사분면, 4사분면 다 동일하다. 제 1사분면 값만 구해서 4배를 하는 것이 편하다.
    (단 x축과 y축에 겹치는 점은 4배를 하면 안된다.제외.)
  3. 작은 원과 큰 원간의 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; //중복 계산된 점 빼주기
    }
    
    
    
    
}
profile
늦은만큼 코막고 달려!

0개의 댓글