[백준] #1358 하키(python)

수영·2022년 8월 25일

백준

목록 보기
48/117
post-thumbnail

📌문제

지난주에, 민식주식회사는 IIHF(International Ice Hockey Federation)로부터 긴급한 전화를 받았다.

IIHF는 같은 팀이 링크안에 너무 많으면 알람이 울리는 시스템을 설치해달라고 요청했다. 시스템은 다음과 같이 3개의 부분으로 이루어진다.

디지털카메라가 링크의 사진을 매 1초마다 찍는다.
디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.
하키 링크는 (X, Y)가 가장 왼쪽 아래 모서리인 W * H 크기의 직사각형과, 반지름이 H/2이면서 중심이 (X, Y+R), (X+W, Y+R)에 있는 두 개의 원으로 이루어져 있다. 아래 그림을 참고한다.

선수들의 위치가 주어질 때, 링크 안 또는 경계에 있는 선수가 총 몇 명인지 구하는 프로그램을 작성하시오.

입력

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

출력

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

예제 입력

20 10 5 0 3
15 5
1 5
1 1

예제 출력

2

백준 1358번 문제

💡Idea

문제 그대로, 선수들의 좌표가 하키 링크 안에 있는지를 확인하면 됩니다.

정사각형 링크 내에 좌표가 있는지 확인

X<=x<=X+W,    Y<=y<=Y+HX <= x <= X + W, \;\;Y <= y <= Y + H

원 안에 좌표가 있는지 확인

  • 원의 중심까지의 거리가 반지름 내에 있는가를 확인하면 됩니다.
    (Xx)2+(Y+H2y)2<=(H2)2(X - x)^2 + (Y + {H \over 2} - y)^2 <= ({H \over 2})^2

💻코드

  • ⏰ 시간 : 92 ms / 메모리 : 32952 KB
import math
import sys
input = sys.stdin.readline

W, H, X, Y, P = map(int, input().split())

ans = 0
for _ in range(P):
    x, y = map(int, input().split())
    if (X <= x <= X + W and Y <= y <= Y + H) or \
       (X + W <= x and math.pow(X + W - x, 2) + math.pow(Y + H / 2 - y, 2) <= math.pow(H / 2, 2)) or \
       (X >= x and math.pow(X - x, 2) + math.pow(Y + H / 2 - y, 2) <= math.pow(H / 2, 2)):
        ans += 1
print(ans)

링크를 사각형에 반원 두 개가 양 옆으로 붙어있는 모양으로 생각하여, 총 세 부분으로 나누어 문제를 해결하였습니다.

반복문 내의 조건문 if의 조건들은 각각 아래의 범위 내에 있는가를 확인한 것입니다.

  1. 가운데 사각형의 범위 확인
  2. 오른쪽 반원의 범위 확인
  3. 왼쪽 반원의 범위 확인

Reference

좌표가 원의 범위안에 포함되어있는지 체크

profile
하고 싶은 건 그냥 죽도록 합니다

0개의 댓글