본문 바로가기

[IT] 코딩테스트/[문제 및 풀이] 프로그래머스

[프로그래머스] 두 원 사이의 정수 쌍 / 자바(Java)

728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 


해설

r2보다 작은 모든 점을 일일히 계산하기에는 값의 범위가 너무 큽니다.

따라서 원이란 각 사분면이 서로 동일하므로 한 사분면의 개수를 구해 4배를 해주면 더 간단하게 해결 가능합니다.

이때 각 축을 주의해야하는데 저는 y축을 제외했습니다.

두 원 사이의 정수 쌍 예시 (출처 - 프로그래머스)

따라서 x축 기준으로 1~r2의 값을 확인합니다.

각 x별 큰 원과 만나는 점을 max, 작은 원과 만나는 점을 min으로 정합니다.

max는 버림을 통해 최소인 정수로, min은 올림으로 최대인 정수로 변형합니다(각 원 위의 점을 포함하기 위해)

max-min +1을 통해 두 정수 사이의 모든 정수의 수를 구해 sum에 합해주어 문제를 해결합니다.

주의점

  • 각 원 위의 점도 포함하여 센다.
  • 4배로 곱할 때 축이 중복되지 않도록 염두한다.

코드

class Solution {
    public long solution(int r1, int r2) {
        long answer = 0;
        long sum=0;
        // 4배를 곱해주기 위해 x가 0인 y축은 제외하고 연산
        for(int x = 1;x<=r2;x++){
        	// 정수 범위의 최대값
            long max = (long)Math.sqrt(1.0*r2*r2-1.0*x*x);
            // 정수 범위의 최소값
            long min = r1>x ? (long)Math.ceil(Math.sqrt(1.0*r1*r1-1.0*x*x)) : 0;
            // 두 정수 사이의 정수값을 구해서 합
            sum += max-min+1;
        }
        return 4*sum;
    }
}
728x90