프로그래밍/백준

[알고리즘] 백준 1358 파이썬 - 하키

매 석 2022. 12. 27. 13:23
반응형

 

 

1358번: 하키

첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부

www.acmicpc.net

문제

지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.

IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.

  1. 디지털카메라가 링크의 사진을 매 1초마다 찍는다.
  2. 디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
  3. 하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.

하키 링크는 (X, Y)가 가장 왼쪽 아래 모서리인 W * H 크기의 직사각형과, 반지름이 H/2이면서 중심이 (X, Y+R), (X+W, Y+R)에 있는 두 개의 원으로 이루어져 있다. 아래 그림을 참고한다.

선수들의 위치가 주어질 때, 링크 안 또는 경계에 있는 선수가 총 몇 명인지 구하는 프로그램을 작성하시오.

 

문제풀이

import sys,math
input=sys.stdin.readline

w,h,x,y,p=map(int,input().split())
#반지름
r=h/2
arr=[]
cnt=0
for _ in range(p):
    arr.append(list(map(int,input().split())))
for i in arr:
	#01
    if x<=i[0]<=x+w and y<=i[1]<=y+h:
        cnt+=1
    #02
    else:
        a = math.sqrt((i[0]-x)**2+(i[1]-(y+r))**2)
        b = math.sqrt((i[0]-(x+w))**2+(i[1]-(y+r))**2)
        if a<=r or b<=r:
            cnt+=1
        else:
            pass
print(cnt)

- #01 : 만약 입력받은 x,y 좌표가 w*h 크기의 직사각형 안에 있다면 cnt를 1 늘려준다.

- #02 : 그렇지 않다면  (X, Y+R), (X+W, Y+R) 즉 원의 두 중심과 입력받은 x,y 좌표의

           거리를 각각 구하여 a와 b에 저장한다.

           만약 a와 b중 하나라도 거리가 r보다 가깝다면 링크 안에 있기에 cnt를 1 늘려준다.

           이후 cnt를 출력한다.