본문 바로가기
백준/단계별

백준 1002 C#) 터렛

by alpacadabra 2023. 3. 7.

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

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

 

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를 잘 활용하면 교점의 개수를 구할 수 있다.

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

'백준 > 단계별' 카테고리의 다른 글

백준 15652 C#) N과 M (4)  (0) 2023.03.08
백준 15649 C#) N과 M (1)  (0) 2023.03.08
백준 18870 C#) 좌표 압축  (0) 2022.12.30
백준 11651 C#) 좌표 정렬하기 2  (0) 2022.10.12
백준 11650 C#) 좌표 정렬하기  (0) 2022.10.12

댓글