백준/단계별

백준 1002 C#) 터렛

alpacadabra 2023. 3. 7. 12:38

간단한 중~고등학교 수준의 수학 문제.

두 원의 교점 개수를 묻는 문제였다.

 

class Program
{
    static void Main()
    {
        StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput()));

        int t;
        int[] xyr;
        int x1, y1, r1;
        int x2, y2, r2;
        double dist;

        t = int.Parse(Console.ReadLine());
        
        while (t-- > 0)
        {
            xyr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            (x1, y1, r1) = (xyr[0], xyr[1], xyr[2]);
            (x2, y2, r2) = (xyr[3], xyr[4], xyr[5]);
            dist = Math.Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));

            //1. 교점이 무수히 많음
            if (x1 == x2 && y1 == y2 && r1 == r2)
                sw.WriteLine(-1);
            //2. 교점이 2개
            else if (Math.Abs(r1 - r2) < dist && dist < r1 + r2)
                sw.WriteLine(2);
            //3.교점이 1개
            else if (dist == Math.Abs(r1 - r2) || dist == r1 + r2)
                sw.WriteLine(1);
            //4. 교점이 0개
            else
                sw.WriteLine(0);
        }

        sw.Close();
    }
}

 

머리가 복잡할 때는 그림이나 메모를 활용하여 푸는 것도 괜찮다.

문제의 그림은 대략 위와 같이 나타낼 수 있다. (x, y, r에 따라 달라질 수 있다)

여기서 두 중심 사이의 거리는 피타고라스의 정리를 통해 얻을 수 있는데, 얻어낸 거리와 r1, r2를 잘 활용하면 교점의 개수를 구할 수 있다.

어려운 문제는 아니나 원의 교점이라는 아이디어를 떠올리기가 조금 힘들었을 수도 있겠다.