코딩테스트 (C#)

백준 1002 : 터렛 - C# 풀이

UniCoti-sub 2024. 7. 9.
반응형

https://www.acmicpc.net/problem/1002
 

문제 사진

 
이 문제를 보고 설명을 위한 임의의 이름들이지만 이해하기가 어려웠다.
이 문제를 다르게 말하면, 두 원의 교점을 찾는 문제와 같다.
 

using System.Text;

int t = int.Parse(Console.ReadLine());

for (int i = 0; i < t; i++)
{
    string[] s = Console.ReadLine().Split(' ');
    var x1 = int.Parse(s[0]);
    var y1 = int.Parse(s[1]);
    var r1 = int.Parse(s[2]);
    var x2 = int.Parse(s[3]);
    var y2 = int.Parse(s[4]);
    var r2 = int.Parse(s[5]);

    var distance_square = Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2); //피타고라스 정리
    var sumR = Math.Pow(r1 + r2, 2); //합
    var differR = Math.Pow(r1 - r2, 2); //차

    if (distance_square == 0)
    {
        if (r1 == r2) Console.WriteLine("-1");
        else Console.WriteLine("0");
    }
    else if (distance_square == sumR || distance == differR)
    {
        Console.WriteLine("1");
    }
    else if(distance_square < sumR && distance_square > differR)
    {
        Console.WriteLine("2");
    }
    else Console.WriteLine("0");
}

 
두 원이 만나는 점을 구하는 것만을 생각해 보자.
아예 안 만나거나, 1점에서 만나거나, 2점에서 만나거나, 무수히 많은 점에서 만날 것이다.
 

1. distance_square == 0

가장 쉽게 생각할 수 있는 게 두 원의 중심이 같은 경우인데,
이 경우 반지름이 같으면 무수히 많이 만나 -1을 출력해야 하고,
반지름이 다르면 아예 만나지 않기에 0을 출력해야 한다.

2. distance_square == sumR || distance == differR

한 점에서 만나는 경우, 두 반지름의 합이 곧 두 원점 사이의 거리가 된다.
접하는 경우는 원점끼리 일직선으로 이을 수 있으며 그 길이가 두 반지름의
합이 되기 때문이다. 따라서 제곱해도 같기에 저렇게 표현된다.

3. distance_square < sumR && distance_square > differR

예시 사진. 반지름:3

마지막으로 두 반지름의 합보다 원점 사이의 거리가 작으며 두 반지름의 차보다 클 경우인데,
이건 원이 두 점에서 만날 경우이다. 위 사진의 경우를 생각해 보자.
두 반지름의 합과 원점 사이의 거리가 같을 때 한 점에서 만나기에 당연하게도 두 점에서 만나려면
두 반지름의 합보다 원점 사이의 거리가 작아야 하고, 두 반지름의 차가 원점 사이의 거리보다 커야 하는데,
두 반지름의 차가 원점 사이의 거리보다 크지 않으면 원 안에 포함되는 그림이 나오게 되어 그렇다.


오늘의 느낀 점)

원래는 게임 개발을 하면서 수학 쪽은 잘한다고 생각했는데, 평면으로 들어와 보니 또 느낌이 달랐다.
게임 수학만 연습해서 그런 것 같기도 한데, 이렇게 전반적인 수학은 연습하기 어렵겠다고 느꼈다.
그래도 수학을 한 번도 놓은 적이 없고 실제로도 재밌어해서 포기하지 않고 이해할 수 있었던 것 같다.
학생인 나도 몇 년 전 내용이라 기억이 잘 안 나는데 어른들은 기억하기 힘들 것 같다.
 
또한 여러 글들을 찾아보면서 StringBuilder의 존재를 알고 여러 가지 메서드를 알게 되었다.
개인적으로 자주 쓸까 싶긴 하지만 더 효율적인 방법을 찾은 것 같아 최적화할 때 좋을 듯하고,
좀 더 체계적으로 코드를 짜야할 때 이용할 수 있을 것 같다. 무엇보다도 남이 쓴 코드에서
StringBuilder가 나올 때 이해할 수 있게 되었다는 점에 만족하고 있다.
 
지금 코딩테스트를 풀기 시작한 지 3일 차인데, 아직까지 꾸준히 하고 있어 줘서 고맙다.
앞으로도 하루 한 문제씩이라도 꾸준히 풀었으면 좋겠다.


이상으로 도움이 되었길 바라며,
 
끝.
 
 

반응형

댓글