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
마지막으로 두 반지름의 합보다 원점 사이의 거리가 작으며 두 반지름의 차보다 클 경우인데,
이건 원이 두 점에서 만날 경우이다. 위 사진의 경우를 생각해 보자.
두 반지름의 합과 원점 사이의 거리가 같을 때 한 점에서 만나기에 당연하게도 두 점에서 만나려면
두 반지름의 합보다 원점 사이의 거리가 작아야 하고, 두 반지름의 차가 원점 사이의 거리보다 커야 하는데,
두 반지름의 차가 원점 사이의 거리보다 크지 않으면 원 안에 포함되는 그림이 나오게 되어 그렇다.
오늘의 느낀 점)
원래는 게임 개발을 하면서 수학 쪽은 잘한다고 생각했는데, 평면으로 들어와 보니 또 느낌이 달랐다.
게임 수학만 연습해서 그런 것 같기도 한데, 이렇게 전반적인 수학은 연습하기 어렵겠다고 느꼈다.
그래도 수학을 한 번도 놓은 적이 없고 실제로도 재밌어해서 포기하지 않고 이해할 수 있었던 것 같다.
학생인 나도 몇 년 전 내용이라 기억이 잘 안 나는데 어른들은 기억하기 힘들 것 같다.
또한 여러 글들을 찾아보면서 StringBuilder의 존재를 알고 여러 가지 메서드를 알게 되었다.
개인적으로 자주 쓸까 싶긴 하지만 더 효율적인 방법을 찾은 것 같아 최적화할 때 좋을 듯하고,
좀 더 체계적으로 코드를 짜야할 때 이용할 수 있을 것 같다. 무엇보다도 남이 쓴 코드에서
StringBuilder가 나올 때 이해할 수 있게 되었다는 점에 만족하고 있다.
지금 코딩테스트를 풀기 시작한 지 3일 차인데, 아직까지 꾸준히 하고 있어 줘서 고맙다.
앞으로도 하루 한 문제씩이라도 꾸준히 풀었으면 좋겠다.
이상으로 도움이 되었길 바라며,
끝.
'코딩테스트 (C#)' 카테고리의 다른 글
백준 1004 : 어린 왕자 - C# 풀이 (0) | 2024.07.12 |
---|---|
백준 1003 : 피보나치 함수 - C# 풀이 (0) | 2024.07.09 |
백준 1008 : A/B - C# 풀이 (0) | 2024.07.08 |
백준 1000 : A+B, 1001 : A-B, 10098 : AxB - C# 풀이 (0) | 2024.07.08 |
C#의 기본 구조 완전히 이해하기 (0) | 2024.07.07 |
댓글