백준 1358 하키

Seo-Faper·2022년 10월 30일
0

알고리즘 문제해결

목록 보기
2/19
post-custom-banner

지난주에, 민식주식회사는 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보다 작거나 같은 정수이다.

출력

첫째 줄에 링크 안에 있는 선수의 수를 출력한다.

예제 입력 1 

20 10 5 0 3 

15 5

1 5

1 1 
예제 출력 1 

2

문제는 어려워 보이지만 간단하다.

i )왼쪽 반원의 범위에 있는가

ii) 중간 사각형의 범위에 있는가

iii) 오른쪽 반원의 범위에 있는가

이 3가지의 조건을 부등식을 이용해 계산하면 된다.

W, H, X, Y, P = map(int,input().split())

def f(x,y):
    # 사각형 안에 있는 지
    if X <= x <= X + W and Y <= y <= Y+ H: return True

    # 왼쪽 반원 안에 있는지 
    if (x-X)**2 + (y-(H/2+Y))**2 <= (H/2)**2: return True

    # 오른쪽 반원 안에 있는지
    if (x-(X+W))**2 + (y-(H/2+Y))**2 <= (H/2)**2: return True

    return False

ans  = 0
for i in range(P):
    x,y = map(int,input().split())
    if f(x,y): ans +=1
print(ans)

profile
gotta go fast
post-custom-banner

0개의 댓글