알고리즘
입력 받은 좌표를 토대로 쌍들 사이 최단거리와 최단거리를 갖는 쌍들의 개수
개발 초보
2023. 6. 14. 23:01
import java.io.*;
import java.lang.*;
import java.util.*;
public class Main {
public static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args){
int n = scanner.nextInt();
Point2D[] points = new Point2D[n];
for(int i = 0 ; i < n ; i++){
int x= scanner.nextInt();
int y= scanner.nextInt();
points[i] = new Point2D(x, y);
}
//points => N개의 점의 배열
int minDist = Integer.MAX_VALUE; // 쌍들중 가장 짧았던 거리
int minCount = 0; //쌍들중 minDist라는 거리를 가지는 쌍의 갯수
for(int i=0; i <n; i++){
for(int j=0 ; j<i; j++){
//<i,j> := i는 0~n-1 이고 j<i인 모든 쌍
int sqd = points[i].getSquaredDistanceTo(points[j]); //sqd변수에 좌표들 간의 거리를 대입
if(sqd < minDist){ //대입된 거리가 기존 최단거리보다 짧다면
minDist = sqd; //최단거리 갱신
minCount = 1; //1로 초기화
}else if(sqd == minDist) {
//갱신은 안일어났지만, 최소거리를 가진 쌍을 새로 발견
minCount++;
}
}
}
System.out.printf("%.1f\n", Math.sqrt(minDist));
System.out.printf("%d", minCount);
}
}
class Point2D{ //좌표를 위치를 저장하기 위해 만든 객체
int x;
int y;
public Point2D(int x, int y){
this.x = x;
this.y = y;
}
/**
* 2차원 평면 상에서 점 this부터 점 target까지 거리의 제곱을 계산하는 함수
* @param target
* @return
*/
public int getSquaredDistanceTo(Point2D target){
int deltaX = this.x - target.x; //x좌표의 차
int deltaY = this.y - target.y; //y 좌표의 차
return deltaX*deltaX + deltaY* deltaY; //deltaX의 제곱 + deltaY의 제곱
}
public double getDistanceTo(Point2D target){
return Math.sqrt(this.getDistanceTo(target)); //제곱근을 씌워 거리를 반환
}
}