[백준/파이썬] 1358번 하키 풀이

업데이트:



문제 정보


풀이

문제

링크장 영역(직사각형 + 양옆 반원) 안에 포함되는 선수 수를 세는 문제입니다.

코드

w,h,x,y,p=map(int,input().split())

def ccw(a,b,c):
    v=(a[0]*b[1]+b[0]*c[1]+c[0]*a[1])-(a[1]*b[0]+b[1]*c[0]+c[1]*a[0])
    try: return v//abs(v)
    except ZeroDivisionError: return 0

def isInCircle(c, r, p):
    return r**2 >= (c[0]-p[0])**2+(c[1]-p[1])**2

a,b,c,d=(x,y),(x+w,y),(x+w,y+h),(x,y+h)
c1,c2=(x,y+h//2),(x+w,y+h//2)

ans = 0
for i in range(p):
    pos=tuple(map(int,input().split()))
    isInRect = ccw(a,b,pos)>-1 and ccw(b,c,pos)>-1 and ccw(c,d,pos)>-1 and ccw(d,a,pos)>-1
    isInC1 = isInCircle(c1, h//2, pos)
    isInC2 = isInCircle(c2, h//2, pos)
    if isInRect or isInC1 or isInC2: ans+=1
print(ans)

설명

각 선수 좌표에 대해

  • 직사각형 내부 여부
  • 왼쪽 반원 내부 여부
  • 오른쪽 반원 내부 여부

를 검사해 하나라도 참이면 카운트합니다.



댓글남기기