알고리즘

입력 받은 좌표를 토대로 쌍들 사이 최단거리와 최단거리를 갖는 쌍들의 개수

개발 초보 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)); //제곱근을 씌워 거리를 반환
	}

}

10주 완성 알고리즘 코딩테스트 - goorm edu에서 들으실 수 있는 내용입니다.