[백준/파이썬] 1358번 하키 풀이
업데이트:
문제 정보
- 문제 출처: 백준 온라인 저지
- 문제 링크: 1358번 하키
- 문제풀이 코드 GitHub 링크
- 제출 언어: Python 3
풀이
문제
링크장 영역(직사각형 + 양옆 반원) 안에 포함되는 선수 수를 세는 문제입니다.
코드
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)
설명
각 선수 좌표에 대해
- 직사각형 내부 여부
- 왼쪽 반원 내부 여부
- 오른쪽 반원 내부 여부
를 검사해 하나라도 참이면 카운트합니다.
댓글남기기