문제 링크
주의사항
- JAVA를 사용하여 프로그램을 사용하였습니다.
- 백준에서 코드를 작성하였을 때 아래 형태에서 Main에서 결과가 출력되어야 합니다.
public class Main{
public static void main(String[] args){
}
}
문제 설명
접근 방법
이 문제에 핵심은
1. 하키장에 존재하는 선수의 수를 결과로 출력해야 합니다.
저는 하키장이 반원 + 사각형 + 반원의 형태로 각 도형에 선수가 존재하는지 확인하였습니다.
사각형은 아래와 같이 존재한다.
선수가 위 사각형에 위치하려면
선수의
x좌표는 X≤ x ≤ X+W
y좌표는 Y≤ y ≤ Y+H
만약 x좌표와 y좌표가 위에 조건을 만족한다면 플레이어는 하키장에 존재한다고 표현할 수 있습니다.
반원은 아래와 같다.
문제에 그림을 살펴보면 높이의 값은 반원의 지름입니다.
반지름 = H/2
선수가 위 반원에 위치하려면
반원의 중심과 선수의 위치의 거리가 반지름보다 작거나 같아야 합니다.
반지름 ≥ 반원 중심과 선수의 거리
선수의 위치와 반원의 중심의 거리를 구해서 반지름보다 작거나 같으면 선수가 하키장에 있다고 표현할 수 있습니다.
입력되는 모든 선수들을 사각형 및 반원에 존재하는지 확인하여 존재하는 선수들의 수를 결과로 출력합니다.
문제를 해결한 알고리즘의 과정입니다.
1. 입력값을 저장합니다.
2. 모든 선수들의 위치를 사각형 및 반원 안에 존재하는지 확인합니다.
3. 안에 존재하는 선수들의 수를 결과로 출력합니다.
- BufferedReader를 사용하여 입력 값을 받았습니다.
- StringTokenizer을 통해서 W,H,X,Y,P와 선수들의 위치를 분리하였습니다.
- 각 선수들이 사각형 및 반원에 존재하는지 함수를 실행시켜 확인하였습니다.
- 사각형이나 반원에 존재하면 해당 선수는 하키장안에 존재한다고 판단합니다.
- 모든 선수를 탐색 후 하키장 안에 존재하는 선수의 수를 BufferedWrtier에 저장합니다.
- BufferedWriter에 저장된 결과값을 출력하였습니다.
- squareCal은 선수가 사각형의 존재하는지 확인하는 함수입니다.
- semicircleCal은 선수가 반원의 존재하는지 확인하는 함수입니다.
- pointDistance은 점과 점사이의 거리를 구하는 함수입니다.
import java.util.*;
import java.io.*;
public class Main {
static int W,H,X,Y,P, player = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//입력값 처리하는 BufferedReader
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//결과값 출력하는 BufferedWriter
StringTokenizer st = new StringTokenizer(br.readLine()," ");
W = Integer.parseInt(st.nextToken()); //Width
H = Integer.parseInt(st.nextToken()); //Height
X = Integer.parseInt(st.nextToken()); //X
Y = Integer.parseInt(st.nextToken()); //Y
P = Integer.parseInt(st.nextToken()); //입력되는 선수 수
//선수의 위치 및 하키장에 있는지 확인하는 함수
for(int i=0;i<P;i++) {
st = new StringTokenizer(br.readLine()," ");
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
//사각형이나 반원에 존재하면 하키장에 존재
if(squareCal(x, y) || semicicleCal(x, y))
player++;
}
bw.write(player + "\n"); //하키장 안에 있는 선수 수 BufferedWriter 저장
bw.flush(); //결과 출력
bw.close();
br.close();
}
//선수가 사각형 안에 존재하는지 확인하는 함수
static boolean squareCal(int x, int y) {
if(x>=X && y>=Y && x<=X+W && y<=Y+H)
return true;
return false;
}
//선수가 반원 안에 존재하는지 확인하는 함수
static boolean semicicleCal(int x, int y) {
int radius = H/2; //지름 = 높이, 반지름 = 높이/2
if(x<X) { //왼쪽 반원
int centerX = X;
int centerY = Y + radius;
double distance = pointDistance(x, y, centerX, centerY);
if(distance <= radius) //반지름보다 작거나 같으면 안에 존재
return true;
}else if(x>X+W) { //오른쪽 반원
int centerX = X + W;
int centerY = Y + radius;
double distance = pointDistance(x, y, centerX, centerY);
if(distance<=radius) //반지름보다 작거나 같으면 안에 존재
return true;
}
return false;
}
//각 위치별 거리 구하는 함수
static double pointDistance(int x1, int y1, int x2, int y2) {
double distance = Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
return distance;
}
}
'백준' 카테고리의 다른 글
[백준] 단계별로 풀어보기(단계:25, 그래프와 순회,JAVA)24479번, 알고리즘 수업 - 깊이 우선 탐색 1 (0) | 2022.05.19 |
---|---|
[백준] code.plus(시뮬레이션과 구현,JAVA)2290번, LCD Test (0) | 2022.05.18 |
[백준] code.plus(시뮬레이션과 구현,JAVA)15685번, 드래곤 커브 (0) | 2022.05.16 |
[백준] 단계별로 풀어보기(단계:13, 기하1,JAVA)1004번, 어린 왕자 (0) | 2022.05.16 |
[백준] code.plus(시뮬레이션과 구현,JAVA)14503번, 로봇 청소기 (0) | 2022.05.16 |
댓글