[프로그래머스] 두 원 사이의 정수 쌍 - JAVA

journey📸·2023년 6월 16일
0

코딩테스트 - JAVA

목록 보기
7/7

🔎 문제 설명

문제: https://school.programmers.co.kr/learn/courses/30/lessons/181187
정답 코드: https://github.com/ji-yeon224/coding-test/blob/master/programmers/%EB%91%90_%EC%9B%90_%EC%82%AC%EC%9D%B4%EC%9D%98_%EC%A0%95%EC%88%98_%EC%8C%8D/Solution.java

💡 풀이 방식

  • 1사분면만 계산해서 곱하기 4를 수행
  • x축 y축 위에 있는 좌표는 중복 계산이 됨
  • 마지막에 축 위에 있는 개수를 빼줌

✔ 원의 방정식을 활용

  • 원의 중점이 (0, 0)이기 때문에
    • x^2 + y^2 = r^2 를 활용 하는 것이 포인트
    • y좌표 구하는 방식으로 활용하였기 때문에
    • y^2 = r^2 - x^2 사용
  • 두 원 사이에 존재하는 정수 좌표를 찾아야 함

✔ 정수 범위를 찾아내기

  • x좌표를 1씩 이동하면서 큰 원의 y좌표와 작은 원의 y좌표를 찾아냄
  • 작은 원의 y좌표 보다 크거나 같은 정수 중 가장 작은 정수 찾기
    • 준제 예제에서 x = 1일 때 y = 1.xxx ->
  • 큰 원의 y좌표 보다 작거나 같은 정수 중 가장 큰 정수 찾기
    • 문제 예제 x = 1일 때 y = 2.xxx
  • => x = 1일 때 y 좌표의 범위는 1 ~ 2
for(int i=0; i<= r2; i++){ //x가 i일 때의 y좌표

  double xpow = Math.pow(i, 2);
  if(i > r1) r1pow = 0;
  double y1 =0;
  if(r1pow != 0){
      y1 = Math.sqrt(r1pow - xpow); //작은원
      if(y1 > Math.floor(y1)){
          y1 = Math.ceil(y1);
      }
  }
  double y2 = Math.sqrt(r2pow - xpow); //큰원
  if(y2 > Math.floor(y2)){
      y2 = Math.floor(y2);
  }
  
  answer += (int)y2 - (int)y1 + 1;
  
}

💻 전체 코드

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사분면만 계산
            double xpow = Math.pow(i, 2);
            
            
            if(i > r1) r1pow = 0;
            double y1 =0;
            if(r1pow != 0){
                y1 = Math.sqrt(r1pow - xpow); //작은원
                if(y1 > Math.floor(y1)){
                    y1 = Math.ceil(y1);
                }
            }

            double y2 = Math.sqrt(r2pow - xpow); //큰원
            if(y2 > Math.floor(y2)){
                y2 = Math.floor(y2);
            }
            answer += (int)y2 - (int)y1 + 1;
            
        }
    
        return answer*4 - onLine; //중복 계산된 점 빼주기
    }
    
    
    
    
}
profile
https://iwntberich.tistory.com/

0개의 댓글