2์ฐจ์ ํ๋ฉด์์ n๊ฐ์ ์ ์ด ์ฃผ์ด์ก์ ๋, ์ด ์ ๋ค ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ n(2 โค n โค 100,000)์ด ์ฃผ์ด์ง๋ค. ๋ค์ n๊ฐ์ ์ค์๋ ์ฐจ๋ก๋ก ๊ฐ ์ ์ x, y์ขํ๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์ขํ๋ ์ ๋๊ฐ์ด 10,000์ ๋์ง ์๋ ์ ์์ด๋ค. ์ฌ๋ฌ ์ ์ด ๊ฐ์ ์ขํ๋ฅผ ๊ฐ์ง ์๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ ๊ฑฐ๋ฆฌ์ ์ ๊ณฑ์ ์ถ๋ ฅํ๋ค.
x, y์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ฌ์ด ๊ฑฐ๋ฆฌ์ ์ ๊ณฑ์ ์ถ๋ ฅ
๋ถํ ์ ๋ณต
d ๋ณด๋ค ์์ x๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง point๋ฅผ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅ
d๋ณด๋ค ์์ y๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง point์ด๋ฉด, x,y์ขํ์ ์ฐจ์ด๋ฅผ ๊ตฌํจ
1) ๋ถํ ์ ๋ณต
int mid = (start + end) / 2;
int d = Math.min(closestPair(arrList, start, mid), closestPair(arrList, mid + 1, end));
2) d ๋ณด๋ค ์์ x๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง point๋ฅผ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฅ
for (int i = start; i <= end; i++) {
int t = arrList.get(mid).x - arrList.get(i).x;
if (t * t < d) {
band.add(arrList.get(i));
}
}
3) d๋ณด๋ค ์์ y๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง point์ด๋ฉด, x,y์ขํ์ ์ฐจ์ด๋ฅผ ๊ตฌํจ
for (int i = 0; i < band.size() - 1; i++) {
for (int j = i + 1; j < band.size(); j++) {
int t = band.get(j).y - band.get(i).y;
if (t * t < d)
d = Math.min(d, dist(band.get(i), band.get(j)));
else
break;
}
import java.io.*;
import java.util.*;
public class Divide_2 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int N = Integer.parseInt(br.readLine());
ArrayList<Point> arrList = new ArrayList<>();
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
arrList.add(new Point(x, y));
}
Collections.sort(arrList, (p1, p2) -> p1.x - p2.x); // x์ขํ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ.
bw.write(closestPair(arrList, 0, N - 1) + "\n");
bw.close();
br.close();
}
public static int dist(Point p, Point q) {
return (p.x - q.x) * (p.x - q.x) + (p.y - q.y) * (p.y - q.y);
}
static int bruteForce(ArrayList<Point> arrList, int start, int end) {
int minDist = Integer.MAX_VALUE;
for (int i = start; i < end; i++) {
for (int j = i + 1; j <= end; j++) {
int k = dist(arrList.get(i), arrList.get(j));
minDist = Math.min(k, minDist);
}
}
return minDist;
}
public static int closestPair(ArrayList<Point> arrList, int start, int end) {
int n = end - start + 1;
if (n <= 3) {
return bruteForce(arrList, start, end);
}
int mid = (start + end) / 2;
int d = Math.min(closestPair(arrList, start, mid), closestPair(arrList, mid + 1, end));
ArrayList<Point> band = new ArrayList<>();
for (int i = start; i <= end; i++) {
int t = arrList.get(mid).x - arrList.get(i).x;
if (t * t < d) {
band.add(arrList.get(i));
}
}
Collections.sort(band, (p1, p2) -> p1.y - p2.y);
for (int i = 0; i < band.size() - 1; i++) {
for (int j = i + 1; j < band.size(); j++) {
int t = band.get(j).y - band.get(i).y;
if (t * t < d)
d = Math.min(d, dist(band.get(i), band.get(j)));
else
break;
}
}
return d;
}
static class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
์ฑ๊ณต~