백준 문제풀이

1358. 하키 (자바, Java)

뮤츠 2022. 10. 24. 00:57

아니...그사이에 단계별 풀이에서 정리해고당한 문제다. 이러면 유입이 줄어든다고!

문제는 간단하다. 중간 직사각형과, 양쪽 반원 사이에 있는지를 따지면 된다.

직사각형은 기준점인 x,y에서 대각선으로 맨끝점인 x+w, y+h 사이에 선수의 각 x, y 좌표가 있으면 된다.

원은 원의 중심에서 선수까지의 거리 d가 반지름 h/2보다 작으면 내부에 있다고 볼 수 있다.

그렇게 구해주면 끝.

 

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

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
		int x = Integer.parseInt(st.nextToken());
		int y = Integer.parseInt(st.nextToken());
		int p = Integer.parseInt(st.nextToken());
		
		int r = h/2; // 반지름의 길이
		int count = 0; // 링크 안의 선수의 수를 세는 count변수로 최종출력값.
		
		for (int i=0; i<p; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			int px = Integer.parseInt(st.nextToken());
			int py = Integer.parseInt(st.nextToken());
			
			if ((x<=px && px<=x+w) && (y<=py && py<=y+h)) {
				count++; // 사각형 안에 있는 선수들 수만큼 count를 올려준다.
			} else if ((distance(x, y+r, px, py)<=r)
					|| distance(x+w, y+r, px, py)<=r){
				count++; // 두 원 안에 있는 선수들 수만큼 count를 올려준다.
			}			
		}		
		System.out.println(count);
	}
	
	public static double distance(int x1, int y1, int x2, int y2) {
		return Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2, 2));
	} // 거리를 구할 매소드 생성

}

'백준 문제풀이' 카테고리의 다른 글

1037. 약수 (자바, Java)  (0) 2022.10.24
5086. 배수와 약수 (자바, Java)  (0) 2022.10.24
1004. 어린왕자 (자바, Java)  (0) 2022.10.24
2477. 터렛 (자바, Java)  (0) 2022.10.10
2477. 참외밭 (자바, Java)  (0) 2022.10.10