공부하기/백준

[Python] 백준 풀기 1358 - 하키

XEV 2022. 12. 18. 23:04

파이썬 백준 1358번

실버 4

https://www.acmicpc.net/problem/1358

 

1358번: 하키

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 기하학

 

 

 

 

 

문제 풀기

아이스 링크를 왼쪽 반원, 중앙 직사각형, 오른쪽 반원 세 부분으로 나누어 판별한다.

 

반원 구간에 대해서는 좌표 위의 원과 점 사이의 관계를 이용한다.

중심이 (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)