Competition/Baekjoon
[백준] 2261번 자바
bisi
2020. 3. 23. 13:28
문제 출처
https://www.acmicpc.net/problem/2261
2261번: 가장 가까운 두 점
첫째 줄에 자연수 n(2 ≤ n ≤ 100,000)이 주어진다. 다음 n개의 줄에는 차례로 각 점의 x, y좌표가 주어진다. 각각의 좌표는 절댓값이 10,000을 넘지 않는 정수이다. 같은 점이 여러 번 주어질 수도 있다.
www.acmicpc.net
접근 방식 및 풀이
- 아직도 어려운 개념
- 분할 정복, line sweep 알고리즘 사용하면 금방 풀수 있다고한다..(난 아직..;ㅜ)
- 참고
https://wellohorld.tistory.com/38
[백준 - 2261번] 가장 가까운 두 점 - Java //Wello Horld//
이번에는 BOJ의 2261번 문제 "가장 가까운 두 점" 문제를 풀어보도록 하자 문제는 간단한데, 풀이가 까다로운 문제이다. 먼저, 입력으로 점의 개수 n이 주어지고, 그다음 줄부터 n줄 만큼 각 점의 x, y 의 좌표가..
wellohorld.tistory.com
https://mygumi.tistory.com/294
Line Sweep 알고리즘 :: 마이구미
이 글은 Line Sweep 알고리즘을 다룬다. Line Sweep, Sweep Line, 라인 스위핑 등과 같이 불려진다. 일반적으로 가장 가까운 두 점을 찾는 문제에서 출발한다. 다음 링크의 문제 풀이를 통하여 알고리즘을 설명할..
mygumi.tistory.com
소스 코드
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Point[] points = new Point[n];
StringTokenizer st;
for (int i = 0; i <n ; i++) {
st = new StringTokenizer(br.readLine());
points[i] = new Point(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
// 최소 거리 구하기 하기 위해 x축 기준으로 정렬
Arrays.sort(points, (a,b)->(a.x - b.x));
TreeSet<Point> set = new TreeSet<>((a,b) -> ((a.y == b.y) ? a.x-b.x : a.y - b.y));
set.add(points[0]);//기준
set.add(points[1]);
// 기준이 되는 0과 가장 가까운 1의 거리를 구한다.
long answer = distSquare(points[0], points[1]);
int start =0;
for (int i = 2; i < n ; i++) {
Point cur = points[i];
while (start<i){
Point point = points[start];//처음 시작
long x = cur.x - point.x;
if(x*x > answer){
set.remove(point);
start +=1;
}else {
break;
}
}
int d = (int) Math.sqrt((double) answer) +1;
Point from = new Point(-10001, cur.y-d);
Point to = new Point(10001, cur.y+d);
for (Point point: set.subSet(from,to)) {
long distance=distSquare(cur, point);
answer= Math.min(answer, distance);
}
}
System.out.println(answer);
}
private static long distSquare(Point A, Point B){
return (long) ((A.x - B.x)*(A.x - B.x) + (A.y - B.y)*(A.y - B.y));
}
}
class Point{
int x;
int y ;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
결과
..아직 확인 중에 있습니다.!...