알고리즘 유형 : 기하
풀이 참고 없이 스스로 풀었나요? : O
https://www.acmicpc.net/problem/1358
import sys
input = sys.stdin.readline
W, H, X, Y, P = map(int, input().split())
count = 0
for _ in range(P):
x, y = map(int, input().split())
# 가운데 직사각형 내부에 있는 경우(둘레 포함)
if (X <= x <= X+W) and (Y <= y <= Y+H):
count +=1
continue
# 왼쪽 반원, 오른쪽 반원 내부에 있는 경우(둘레 포함)
R = H/2
d1 = ((x-X)**2 + (y-(Y+R))**2)**0.5
d2 = ((x-(X+W))**2 + (y-(Y+R))**2)**0.5
if d1 <= R or d2 <= R:
count += 1
print(count)
풀이 요약
세 경우로 나눈다.
1) 가운데 직사각형 부분에 선수가 있는 경우
2) 왼쪽 반원에 있는 경우
3) 오른쪽 반원에 있는 경우
가운데 직사각형 부분에 있는 경우는 간단한 조건문으로 카운팅해줄 수 있다.
반원의 경우, "선수의 좌표와 원의 중심과의 거리"와 "원의 반지름"을 비교하여 원의 내부에 있는지를 판별한다. (나머지 반원은 어차피 직사각형에 포함되는 부분이므로 완전한 원에 대해 포함 여부 검사해줘도 무관)