[BOJ/백준-Python]1358번 - 하키

1358번 - 하키

문제

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

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

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

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

입력

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

출력

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

예제 입력 1

20 10 5 0 3
15 5
1 5
1 1

예제 출력 1

2

예제 입력 2

20 10 0 0 14
-5 5
-4 2
-4 8
-3 1
-3 9
0 0
0 10
20 0
20 10
23 1
23 9
24 2
24 8
25 5

예제 출력 2

14

예제 입력 3

52 84 -44 66 10
26 118
-33 106
-49 128
40 114
-10 101
47 85
25 142
-16 140
-82 126
7 145

예제 출력 3

8

예제 입력 4

24 100 -62 71 8
-63 109
-26 164
-9 91
-113 80
-124 75
-95 140
-89 116
-55 113

예제 출력 4

6


해결할 방법을 생각해보자.💡

첫줄에서 너비 높이, X와 Y 그리고 사람의 수 P를 받아주자.

import sys
import math

W, H, X, Y, P = map(int, sys.stdin,readline().split())

사람의 수를 세기 위한 변수 하나를 선언해주자.

count = 0

P 만큼 반복해서 해당 인원이 링크 안에 있는지 확인해줄 것이다. 각 경우의 x,y 좌표를 받아주자.

for i in range(P):
    x, y = map(int, sys.stdin.readline().split())

하키의 링크는 가운데 직사각형 하나와 직사각형의 좌우에 위치한 반원을 더해준 크기다. 원의 반지름은 직사각형 높이 H의 반이다. 그래서 이 문제를 풀려면, 세 부분으로 나눠서 사람 수를 세야한다.

  1. 왼쪽 반원
  2. 직사각형
  3. 오른쪽 반원

그래서 현재 선수가 위치한 x,y 좌표에서 양 쪽 반원의 중심까지의 거리를 구해주자.

    d1 = math.sqrt((x-X) ** 2 + (y-(Y+r)) ** 2)
    d2 = math.sqrt((x-(X+W)) ** 2 + (y-(Y+r)) ** 2)

이제 세 부분에 사람이 있는지 판단하는 조건문을 걸어서 count를 세보자. 받아준 좌표 x,y는 (X,Y)에서 x는 X+W 보다 같거나 작고, y는 y+H 보다 같거나 작은 위치에 있어야 한다. 그리고 아까 구해준 거리 d1, d2 둘중하나가 반지름보다 같거나 작다면 반원안에 위치하는 식으로 코드를 짜주자.

    if (X <= x and x <= X + W and Y <= y and y <= Y + H):
        count += 1
    elif d1 <= r or d2 <= r:
        count += 1

이제 마지막으로 count를 출력해주면 끝

print(count)

코드 💻

import sys
import math

W, H, X, Y, P = map(int, sys.stdin.readline().split())
count = 0
for i in range(P):
    x, y = map(int, sys.stdin.readline().split())
    r = H / 2
    d1 = math.sqrt((x - X) ** 2 + (y - (Y + r)) ** 2)
    d2 = math.sqrt((x - (X + W)) ** 2 + (y - (Y+r)) ** 2)

    if (X <= x and x <= X + W and Y <= y and y <= Y + H):
        count += 1
    elif d1 <= r or d2 <= r:
        count += 1
print(count) 

해결 로그

문제 푼 날짜 체크
2022-07-27
   
   
   
   

2022

[web]jQuery 복습 3

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 2

13 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]jQuery 복습 1

14 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리4

5 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리3

10 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리2

7 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]JavaScript 정리1

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]CSS 기초 정리

11 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[web]HTML 기초 정리

8 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

[Pandas]pandas 연습

3 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑

2021

[Python기초]module

1 분 소요

[Noitce] 고쳐야하거나 틀린 것이 있으면 말씀해주세요!

맨 위로 이동 ↑