Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • LCA
  • 트라이
  • 최소 스패닝 트리
  • 위상 정렬
  • 그래프
  • 정렬
  • 수학
  • 누적합
  • 정수론
  • 구현
  • 분할정복
  • 문자열
  • 기하
  • 큐
  • 백준
  • 백트래킹
  • 스택
  • 이분탐색
  • 조합론
  • SCC
  • 브루트포스
  • 동적계획법
  • UC++
  • 투포인터
  • 트리
  • 유니온 파인드
  • 세그먼트 트리
  • KMP
  • C++
  • 우선순위큐

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 1358번 문제
공부 및 정리/백준 코드

[C++]백준 - 1358번 문제

2022. 7. 29. 12:39

1358번: 하키 (acmicpc.net)

 

1358번: 하키

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

www.acmicpc.net

 

1358번 : 하키


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

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

  1. 디지털카메라가 링크의 사진을 매 1초마다 찍는다.
  2. 디지털카메라가 찍은 사진에서 각 선수의 위치를 뽑아낸다.
  3. 하키 링크 안에 같은 팀 선수가 총 몇 명인지 계산한다.

하키 링크는 (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보다 작거나 같은 정수이다.

 

 

출력


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

 

 


 

생각해 볼 점


 

원과 사각형 지점으로 영역을 분리한 후

 

1. 사각형 내부에 있을 경우

 

선수의 좌표 : x, y가 사각형 좌표 이내에 있는지 확인합니다.

 

2. 원형 공간 내부에 있는 경우

 

선수의 좌표와 원의 중심의 거리가 원의 반지름보다 작거나 같으면 내부에 있다고 판정합니다.

 

 

코드


#include <iostream>

inline bool isInCircle(int dist_x, int dist_y,int R)
{
	return (dist_x * dist_x + dist_y * dist_y) <= R * R;
}

int main()
{
	int W, H, X, Y, P;
	scanf("%d %d %d %d %d", &W, &H, &X, &Y, &P);
	
	int ans = 0;
	int R = H >> 1;
	int R_sq = R * R;
	for (int i = 0; i < P; i++)
	{
		int in_x, in_y;
		scanf("%d %d", &in_x, &in_y);

		//사각형 판정
		if (X <= in_x && in_x <= X + W && Y <= in_y && in_y <= Y + H)
			ans++;
		//원 판정
		else if (in_x < X && isInCircle((X - in_x), (Y + R - in_y), R))
			ans++;
		else if (X + W < in_x && isInCircle((X + W - in_x), (Y + R - in_y), R))
			ans++;
	}

	printf("%d", ans);
	
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 2407번 문제  (0) 2022.10.08
[C++]백준 - 14500번 문제  (0) 2022.10.07
[C++]백준 - 10815번 문제  (0) 2022.07.26
[C++]백준 - 1790번 문제  (0) 2022.07.25
[C++]백준 - 1064번 문제  (0) 2022.05.19
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 2407번 문제
    • [C++]백준 - 14500번 문제
    • [C++]백준 - 10815번 문제
    • [C++]백준 - 1790번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바