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;
    }
}

 

 

 

 

결과 

..아직 확인 중에 있습니다.!...

'Competition > Baekjoon' 카테고리의 다른 글

[백준] 10451번 순열사이클  (0) 2020.03.24
[백준] 4962번 섬의 개수 DFS, BFS  (0) 2020.03.23
[백준] 2667번 단지번호 매기기  (0) 2020.03.22