BoJ 1358 python

정현종·2022년 9월 15일
0

BoJ

목록 보기
2/5

입력
첫째 줄에 수 W H X Y P가 주어진다. P는 선수의 수이다. W와 H는 100보다 작거나 같은 자연수이고, H는 짝수이다. X와 Y는 절댓값이 100보다 작거나 같은 정수이다. P는 최대 50인 자연수이다. 둘째 줄부터 P개의 줄에 각 선수들의 x좌표와 y좌표가 주어진다. 이 좌표는 절댓값이 300보다 작거나 같은 정수이다.

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

import sys
def dire(x,y,ax,ay):
  return (x-ax)**2+(y-ay)**2
  


w,h,x,y,p = map(int,sys.stdin.readline().rstrip().split())

hap = 0
r = h/2
for i in range(p):
  ax ,ay = map(int, sys.stdin.readline().rstrip().split())
  
  if (x <= ax and ax<= (x+w)) and (y <= ay and ay <= (y+h)):
    hap += 1
  elif(dire(x,y+r,ax,ay)<=r**2) or (dire(x+w,y+r, ax,ay)<=r**2):
    hap += 1

print(hap)

문제 해결의 아이디어
사가형과 원으로 나누어 생각하여. 사각형의 좌표 범위 내에 있는경우를 처리하고, 원의 경우 거리와 반지름을 비교하여 처리하였다.

주의점
거리를 처리하며 루트연산을 사용하면, 실수계산 오차에 의해 오답판정을 받을수 있으므로, 루트연산을 사용하지 않고 비교대상인 반지름또한 제곱연산을 하여 계산하였다.

profile
hello~ I want to share code with you~

0개의 댓글