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

최민길(Gale)·2023년 7월 4일
1

알고리즘

목록 보기
84/172

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/181187

이 문제는 원의 방정식을 이용하면 풀 수 있습니다.

원의 방정식은 x^2 + y^2 = r^2입니다. 이 때 원의 방정식에서 특정 x값에서의 y값을 구하고 싶을 경우 y = sqrt(r^2 - x^2)의 식을 통해 구할 수 있습니다. 여기서 두 원 r1과 r2가 있을 경우 두 원에서 특정 x값에서의 y값을 각각 구한 후 큰 값에서 작은 값을 빼면 두 원 사이에 존재하는 점의 개수가 나타납니다.

여기서 주의할 점은 정수 쌍을 어떻게 구하느냐입니다. 정수 쌍은 다음의 개념으로 접근할 수 있습니다. 먼저 작은 원의 경우 현재 위치보다 큰 값이 개수에 포함되기 때문에 구한 값을 올림 처리합니다. 반대로 큰 원의 경우 현재 위치보다 작은 값이 개수에 포함되기 때문에 구한 값을 내림 처리합니다.

그럼 이 방식을 토대로 다시 문제를 접근해보겠습니다. 문제 예시를 보시면 5개씩 모든 사분면이 동일한 위치에 동일한 개수를 갖는 것을 확인할 수 있습니다. 즉 경계값인 x축 또는 y축을 하나씩만 고려해야하기 때문에 0부터 탐색할 경우 축 경계에서의 값이 중복 처리가 됩니다. 따라서 1부터 큰 원의 반지름까지의 x 범위를 설정하여 해당 x값에 따른 y값의 차이를 계속 더해 결과에 4배를 리턴하면 됩니다.

다음은 코드입니다.

import java.util.*;

class Solution {
    public long solution(int r1, int r2) {
        long answer = 0;
        
        for(int x=1;x<=r2;x++){
            long minH = (long)Math.ceil(Math.sqrt(1.0*r1*r1 - 1.0*x*x));
            long maxH = (long)Math.floor(Math.sqrt(1.0*r2*r2 - 1.0*x*x));
            
            answer += (maxH - minH +1);
        }
        
        return answer*4;
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보