알고리즘공부(Algorithm Study)/문제풀이(ProblemSolving)

백준 1358 java - 하키(기하/백준단계별로풀기 기하 clear)

Chann._.y 2022. 5. 19.
728x90

 

 

 

 

2022.05.18 - [알고리즘공부(AlgorithmStudy)/문제풀이(ProblemSolving)] - 백준 1004 java - 어린왕자(기하)

 

 

 

백준 1004 java - 어린왕자(기하)

해당 문제는 이게 되나? 라고 했다가 테케 1번 맞추고 바로 제출하니 패스된 문제이다. 논리상 이거 밖에 없다!라고 해서 냈더니 너무 순순히 성공이 뜬... 신기하다. <문제 풀이/접근과정> 1. 그림

chaaany.tistory.com

종전에 풀었던 어린왕자와 같이 원의 방정식과 좌표평면 상의 거리구하기 개념으로 접근하면 바로 풀린다.

 

기하는 그냥 아냐 모르냐의 개념이기에 바로 소스코드 들어간다.

<문제 접근/풀이 과정>
1.1 x <= px <= x + w && y <= py <= y + h ( 직사각형 내에 하키선수가 존재하는 지)

1.2 (x - px)^2 + (y+h/2 - py)^2 <= (h/2)^2 (왼쪽 원 내에 하키선수가 존재하는 지)
1.3 (x + width - px)^2 + (y+h/2 - py)^2 <= (h/2)^2 (오른쪽 원 내에 하키선수가 존재하는 지)
2. 1의 3가지 조건을 만족하는 갯수를 구하면 된다.
3. 여기서 오른쪽, 왼쪽 원의 경우 반지름으로만 경기장이 구성되어 있지만 이미 가운데 직사각형 내에 원이 포함되므로 1.2, 1.3처럼 원 전체의 둘레 안에 있는지 확인해도 무방하다.

<소스코드>

package boj;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Boj_1358 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		StringTokenizer stz = new StringTokenizer(br.readLine());
		
		int W = Integer.parseInt(stz.nextToken());
		int H = Integer.parseInt(stz.nextToken());
		int X = Integer.parseInt(stz.nextToken());
		int Y = Integer.parseInt(stz.nextToken());
		int P = Integer.parseInt(stz.nextToken());
		
		// x <= px <= x + w
		// y <= py <= y + h
		// (x - px)^2 + (y+h/2 - py)^2 <= (h/2)^2
		// (x + width - px)^2 + (y+h/2 - py)^2 <= (h/2)^2
		int answer = 0;
		
		for (int i = 0; i < P; i++) {
			stz = new StringTokenizer(br.readLine());
			int px = Integer.parseInt(stz.nextToken());
			int py = Integer.parseInt(stz.nextToken());
			double leftR = Math.pow(X-px, 2)+Math.pow(Y+1.0*H/2-py, 2);
			double rightR = Math.pow(X+W-px, 2)+Math.pow(Y+1.0*H/2-py, 2);
			double rr = Math.pow(1.0*H/2, 2);
			if(X <= px && px <= X+W && Y <= py && py <= Y + H || leftR <= rr || rightR <= rr) answer++;
		}
		System.out.println(answer);
		
	}
}

 

이제 백준 단계별로 풀기 25단계까지 14문제 남았다. 얼른 풀고 클래스 밀기, 프로그래머스 풀어야지...!

기하 Clear!

728x90

댓글