두 원 사이의 정수 쌍

두 원 사이의 정수 쌍

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

입출력 예 설명.png

그림과 같이 정수 쌍으로 이루어진 점은 총 20개 입니다.

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


import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Main {

    public static void main(String[] args) {

        int r1 = 2;
        int r2 = 3;

        var reuslt = solution(r1, r2);

        System.out.println(reuslt);
    }

    public static long solution_(int r1, int r2) {
        int total = (r2 + 1) * (r2 + 1);
        int lineDot = r2 - r1 + 1;

        int count = 0;

        for (int i = r2; i > -1; i--) {
            System.out.print(i + " : ");
            for (int x = 0; x <= r2; x++) {
                if (r2 * r2 >= i * i + x * x) {
                    System.out.print("O  ");
                } else {
                    System.out.print("X  ");
                    count++;
                }
            }
            System.out.println();
        }

        System.out.println();
        System.out.println();

        for (int i = r1; i > -1; i--) {
            System.out.print(i + " : ");
            for (int x = 0; x <= r1; x++) {
                if (r1 * r1 > i * i + x * x) {
                    System.out.print("X  ");
                    count++;
                } else {
                    System.out.print("O  ");
                }
            }
            System.out.println();
        }

        System.out.println();

        System.out.println(total);
        System.out.println(count);
        System.out.println(lineDot);


        return (total - count - lineDot) * 4;
    }
}

시간초과... ㅠㅠ

public class Main {

    public static void main(String[] args) {

        int r1 = 2;
        int r2 = 3;

        var reuslt = solution(r1, r2);

        System.out.println(reuslt);
    }

    public static long solution(int r1, int r2) {
        long answer = 0;

        // 4개의 사분면 중 1개만 구한뒤 4를 곱한다.
        for( int i = 1; i <= r2 ; i++){
            double y2 = Math.sqrt(Math.pow(r2,2) - Math.pow(i,2));
            double y1 = Math.sqrt(Math.pow(r1,2) - Math.pow(i,2));
            answer += ( (long)y2 - (long)Math.ceil(y1) + 1);
        }
        answer *= 4;

        return answer;
    }

}