어떻게 하필 하키 문제?!
이번 문제는 링크장 위에 있는 선수들의 수를 구하면 된다. 링크장은 직사각형과 직사각형의 높이를 지름으로 하는 두 원이 이어진 형태로 이루어져 있다.

사진 설명을 입력하세요.
그래서 저번 문제인 어린 왕자처럼, 거리를 구해서 풀 생각으로 접근했다.
다만 가운데 직사각형 부분에서는 거리를 구하는 것보다 단순 xy좌표를 따지는 게 쉬우므로 그렇게 처리했고, 그 경우가 아닐 때는 원의 중심으로부터의 거리를 재고 그걸 반지름과 비교하는 방법으로 했다.
원1의 중심은 (x, y+r) , 원2는 (x+w, y+r)이다. 이 때 r은 링크장 높이의 절반이다.
W, H, X, Y, P = map(int, input().split())
r = H / 2
count = 0
for i in range(P):
x, y = map(int, input().split())
if X <= x <= X + W and Y <= y <= Y + H:
count += 1
else:
d1 = ((X - x)**2 + (Y+r - y)**2)**0.5
d2 = ((X+W - x)**2 + (Y+r - y)**2)**0.5
if d1 <= r or d2 <= r:
count += 1
print(count)
좌표가 x에서부터 x + 가로길이, y 에서부터 y + 세로길이 안에 있을 때는 직사각형의 안에 있는 것이므로 그냥 바로 카운트를 해주고, 그렇지 않은 경우에만 두 원의 중심으로부터 거리를 구하고 반지름과 비교한다.
이 때, 링크장의 경계에 있는 선수도 카운트를 해야 해서 등호를 붙여줘야 한다. (이거 안 해서 처음에 틀렸다.)

'Algorithms' 카테고리의 다른 글
백준 1037. 약수 (0) | 2022.06.09 |
---|---|
백준 5086. 배수와 약수 (0) | 2022.06.09 |
백준 1004. 어린 왕자 (0) | 2022.06.09 |
백준 1002. 터렛 (0) | 2022.06.09 |
백준 3053. 택시 기하학 (0) | 2022.06.09 |
댓글