문제) 지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.
IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.
- 디지털카메라가 링크의 사진을 매 1초마다 찍는다.
- 디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
- 하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.
하키 링크는 (X, Y)가 가장 왼쪽 아래 모서리인 W * H 크기의 직사각형과, 반지름이 H/2이면서 중심이 (X, Y+R), (X+W, Y+R)에 있는 두 개의 원으로 이루어져 있다. 아래 그림을 참고한다. 선수들의 위치가 주어질 때, 링크 안 또는 경계에 있는 선수가 총 몇 명인지 구하는 프로그램을 작성하시오.
입력) 첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부터 P개의 줄에 각 선수들의 x좌표와 y좌표가 주어진다. 이 좌표는 절댓값이 300보다 작거나 같은 정수이다.
출력) 첫째 줄에 링크 안에 있는 선수의 수를 출력한다.
def in_square(w, h, x, y, px, py):
X = (x <= px) and (px <= x + w)
Y = (y <= py) and (py <= y + h)
return X and Y
def in_circle(ox, oy, px, py, r):
d = ((px-ox)**2 + (py-oy)**2)**(1/2)
return d <= r
w, h, x, y, p = map(int, input().split())
result = 0
for _ in range(p):
px, py = map(int, input().split())
r = h // 2
if in_square(w, h, x, y, px, py): result += 1
elif in_circle(x, y + r, px, py, r): result += 1
elif in_circle(x + w, y + r, px, py, r): result += 1
print(result)
풀이 : 정보들이 입력되었을 때 해당 선수가 링크장 내에 있는지 알아내기 위해서 링크장의 구역을 3부분으로 나누었다. 밑변이 W이고 높이가 H인 사각형, 중심좌표가 (x, y+r)이고 반지름이 (r=H/2)인 반원 마지막으로는 중심좌표가 (x + W, y+r)이고 반지름이 (r=H/2)인 반원. 해당 구역들에 대해서 선수의 좌표를 받았을 때 각각의 기준에 맞게 거리를 계산하면 선수가 링크장 내에 있는지를 판별할 수 있다.
'~2025' 카테고리의 다른 글
백준) 1269 - 대칭 차집합 [파이썬] (0) | 2022.06.14 |
---|---|
백준) 14425 - 문자열 집합 [파이썬] (0) | 2022.06.14 |
백준) 1920 - 수 찾기 [파이썬] (0) | 2022.06.11 |
백준) 1004 - 어린 왕자 [파이썬] (0) | 2022.06.11 |
백준) 2477 - 참외밭 [파이썬] (0) | 2022.06.09 |