본문 바로가기

코딩/프로그래머스

[프로그래머스/JAVA] 코딩테스트 연습 > 연습문제 > 두 원 사이의 정수 쌍 (by 다알쥐AI)

728x90

[두 원 사이의 정수 쌍] 코딩테스트 연습 > 연습문제 > 두 원 사이의 정수 쌍

 

 

※ 주의 : 문제풀이 방법은 다양합니다. 참고만 해주세요

[문제설명]

더보기

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;
    }
}

 

[실행결과]

 

728x90