링크 안에 있는 판단하는 방법으로 링크 밖을 하나씩 제거하는 방식을 생각해내었다.
IsInLink 함수
일단 외곽에 있는 모든 좌표들은 볼 필요 없이 false를 반환
px < x 일 때
px > x + w 일 때
위 그림 처럼 파란색 영역으로 된 곳은 모두 체크한 영역이므로 나머지 부분은 무조건 링크안에 포함이 되기 때문에 true를 반환
namespace BOJ_1358
{
class Program
{
static void Main()
{
int[] inputs = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
int w = inputs[0];
int h = inputs[1];
int x = inputs[2];
int y = inputs[3];
int p = inputs[4];
int count = 0;
for (int i = 0; i < p; i++)
{
inputs = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
if (IsInLink(w, h, x, y, inputs[0], inputs[1]))
{
count++;
}
}
Console.WriteLine(count);
}
static bool IsInLink(int w, int h, int x, int y, int px, int py)
{
int r = h / 2;
// 왼쪽
if (px < x - r) return false;
// 오른쪽
if (px > x + w + r) return false;
// 아래
if (py < y) return false;
// 위
if (py > y + h) return false;
// 왼쪽 호 체크
if (px < x)
{
int cy = y + h / 2;
int dx = px - x;
int dy = py - cy;
return dx * dx + dy * dy <= r * r;
}
// 오른쪽 호 체크
if (px > x + w)
{
int cx = x + w;
int cy = y + h / 2;
int dx = px - cx;
int dy = py - cy;
return dx * dx + dy * dy <= r * r;
}
// 무조건 포함됨
return true;
}
}
}
x + w로 체크했어야 했는데 x + h로 체크하고 있었다. 좀 더 신중히 풀자
기하학