Algorithm

[프로그래머스/JavaScript] Lv.2 두 원 사이의 정수 쌍

cob 2023. 6. 21. 14:15

 

https://school.programmers.co.kr/learn/courses/30/lessons/181187

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 


1. 문제 설명

x축과 y축으로 이루어진 2차원 직교 좌표계에 중심이 원점인 서로 다른 크기의 원이 두 개 주어집니다. 반지름을 나타내는 두 정수 r1, r2가 매개변수로 주어질 때, 두 원 사이의 공간에 x좌표와 y좌표가 모두 정수인 점의 개수를 return하도록 solution 함수를 완성해주세요.
※ 각 원 위의 점도 포함하여 셉니다.

제한 사항

 


2. 입출력

설명 사진

 

 

 


3. 문제 풀이

3-1) 피타고라스 활용

피타고라스
피타고라스 활용

  • 피타고라스는 직각삼각형일 때 두 변을 활용하여 나머지 한 변의 길이를 알 수 있다.
  • 반지름(r)과 x축을 활용하여 원 내부의 점의 개수(y축 길이)를 구할 수 있다.
  • 주의할 점은 각 원 위의 점도 포함하기 때문에 r1의 원 위에 있는 점의 개수도 포함시켜야 한다.(r1 = 작은 원, r2 큰 원)
ex)
r1 = 5, x = 3
y = 5^2 - 3^2 = 4^2
* y축의 길이는 4가 나오지만 원 위에 점은 포함하므로 4 - 1 = 3이 된다. 
포함 예


 

 

3-2) 코드

큰 원의 반지름(r2)까지 반복하여 x축 각각의  점의 개수 구한다. => 작은 원(r1)도 동일 => 1사분면의 큰 원의 점의 개수 - 작은 원의 점의 개수로 두 원 사이의 점의 개수를 구한다.
function solution(r1, r2) {
    var answer = 0;
    var r1Y = 0; 
    
    // 1) r2의 길이 만큼 반복문
    for(let i = 1; i < r2; i++) {
        
        // 2) 큰 원(r2)의 경우 Y축 정수의 길이 만큼 점의 개수를 가지기 때문에 소수점을 버린다.
        answer += Math.floor(Math.sqrt(r2**2 - i**2));
        
        // 3) 작은 원(r1)도 동일하게 점의 개수를 구한다.
        if(i < r1) {
            r1Y = Math.sqrt(r1**2 - i**2);
            
            // 4) 작은 원(r1)의 위에 점이 있는 경우
            if(Number.isInteger(r1Y)) {
            
                // 5) 두 점 사이에 있는 점이라고 판단 하므로 r1의 Y축 길이에서 -1
                answer -= r1Y - 1;
            } else {
            
                // 6) 위에 있지 않으면 Y축 정수 길이 만큼 점의 개수를 가진다.
                answer -=  Math.floor(r1Y);
            }
        }
    }
    
    // 7) 1사분면의 점의 개수를 구했으면 4를 곱한다.
    answer *= 4;
    
    // 8) x축, y축 위에 있는 두 원 사이의 점의 개수 더한다.
    answer += (r2 - r1 + 1) * 4;
    
    return answer;
}

 

 

반응형