본문 바로가기
Algorithms

백준 1358. 하키

by Brian Go 2022. 6. 9.

 

어떻게 하필 하키 문제?!

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

대표사진 삭제

사진 설명을 입력하세요.

그래서 저번 문제인 어린 왕자처럼, 거리를 구해서 풀 생각으로 접근했다.

다만 가운데 직사각형 부분에서는 거리를 구하는 것보다 단순 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

댓글