1. 문제

두 원 사이의 정수 쌍



2. 개요

중심이 원점이고 반지름이 각각 r1, r2 인 두 원이 있다.

두 원 사이(각 원 위에 존재하는 점도 포함)의 x, y좌표가 모두 정수인 점의 개수를 모두 구하는 문제.



3. 풀이 및 코드

3-1. 풀이

원점과 큰 원 내부의 점 사이의 거리를 계산해나가는 이중 for문으로 시도했으나 시간초과로 실패했다.

for문을 하나만 돌리도록 y를 1씩 줄여나가면서 해당 y좌표에서 큰 원의 x좌표와 작은 원의 x좌표의 차이를 이용하여 정점의 개수를 구해보는 시도를 했다.

원은 x, y축에 대하여 대칭이므로 1사분면의 1 <= y <= r2인 구역에서 조건에 맞는 정점의 개수 *4 로 모든 정점의 개수를 구할 수 있다.


! 제곱 및 제곱근 계산 시 MathF를 이용한 계산으로는 통과할 수 없었다.

3-2. C#

using System;


public class Solution {
    public long solution(long r1, long r2) {
        double answer = 0;

        for (long i = r2; i > 0; i--)
        {
            double large_maxx = Math.Pow(Math.Pow(r2, 2) - Math.Pow(i, 2), 0.5f);
            double flarge_maxx = Math.Floor(large_maxx);

            if (i >= r1)
                answer += flarge_maxx + 1f;

            else
            {
                double small_maxx = Math.Pow(Math.Pow(r1, 2) - Math.Pow(i, 2), 0.5f);
                double fsmall_maxx = Math.Floor(small_maxx);

                answer += flarge_maxx - fsmall_maxx;

                if (small_maxx == fsmall_maxx)
                    answer += 1;
            }

        }

        return (long)answer * 4;
    }
}

Comments