파이썬 백준 1358번
실버 4
https://www.acmicpc.net/problem/1358
문제 보기
분류: 기하학
문제 풀기
아이스 링크를 왼쪽 반원, 중앙 직사각형, 오른쪽 반원 세 부분으로 나누어 판별한다.
반원 구간에 대해서는 좌표 위의 원과 점 사이의 관계를 이용한다.
중심이 (a, b) 이고 반지름이 r 인 원의 방정식이 주어졌을 때, 점 (x, y) 위치는 각각의 식을 만족한다.
1. (x, y) 가 원의 내부에 있을 때,
(x - a)^2 + (y - b)^2 < r^2
2. (x, y) 가 원의 외부에 있을 때,
(x - a)^2 + (y - b)^2 > r^2
이 성질을 이용하여 아이스 링크의 반원 안에 선수가 있는지 없는지에 대해 참, 거짓을 판별한다.
조건문에 대해 참일 경우 1 을 return 하여 count 를 누적해 더한다.
코드 보기
import sys
inputdata = sys.stdin.readline
def fnIsPlayerInTheRink(px, py):
## 리스트로 저장된 링크 정보를 각각 나누어 저장.
(W, H, X, Y, P) = rink_info
## 사각형 왼쪽 구간에 대해.
if X > px:
## 주어진 중심축과 반지름으로 이루어진 원에 px, py 좌표를 입력하였을때,
## True 이면 1 을 return. (원의 내부)
if (px - X)**2 + (py - (Y + H/2))**2 <= (H/2)**2:
return 1
## 사각형 안쪽 구간에 대해.
elif X <= px <= X + W:
## 좌표 py 가 사각형 구간일때, True 이고 1 을 return
if Y <= py <= (Y + H):
return 1
## 사각형 오른쪽 구간에 대해.
elif X + W < px:
## 주어진 중심축과 반지름으로 이루어진 원에 px, py 좌표를 입력하였을때,
## True 이면 1 을 return. (원의 내부)
if (px - (X + W))**2 + (py - (Y+H/2))**2 <= (H/2)**2:
return 1
return 0
if __name__ == "__main__":
rink_info = list(map(int, inputdata().split()))
count = 0
for _ in range(rink_info[4]):
px, py = map(int, inputdata().split())
count += fnIsPlayerInTheRink(px, py)
print(count)
'공부하기 > 백준' 카테고리의 다른 글
[Python] 백준 풀기 11656 - 접미사 배열 (0) | 2022.12.20 |
---|---|
[Python] 백준 풀기 2748 - 피보나치 수 2 (0) | 2022.12.19 |
[Python] 백준 풀기 2775 - 부녀회장이 될테야 (0) | 2022.12.17 |
[Python] 백준 풀기 11497 - 통나무 건너뛰기 (0) | 2022.12.16 |
[Python] 백준 풀기 1259 - 팰린드롬수 (0) | 2022.12.15 |