From 09d448d17cfbd0a426df569c6957cffd6fdac743 Mon Sep 17 00:00:00 2001 From: bong6981 Date: Tue, 12 Apr 2022 13:56:42 +0900 Subject: [PATCH] =?UTF-8?q?baekjoon/python/platinum2/q2261=5Fclosest=5Ftwo?= =?UTF-8?q?=5Fpoints(=EA=B0=80=EC=9E=A5=20=EA=B0=80=EA=B9=8C=EC=9A=B4=20?= =?UTF-8?q?=EB=91=90=20=EC=A0=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/src/silver4/Q1920_FindNumber.java | 2 + .../platinum2/q2261_closest_two_points.py | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 baekjoon/java/src/silver4/Q1920_FindNumber.java create mode 100644 baekjoon/python/platinum2/q2261_closest_two_points.py diff --git a/baekjoon/java/src/silver4/Q1920_FindNumber.java b/baekjoon/java/src/silver4/Q1920_FindNumber.java new file mode 100644 index 00000000..8b067844 --- /dev/null +++ b/baekjoon/java/src/silver4/Q1920_FindNumber.java @@ -0,0 +1,2 @@ +package silver4;public class Q1920_FindNumber { +} diff --git a/baekjoon/python/platinum2/q2261_closest_two_points.py b/baekjoon/python/platinum2/q2261_closest_two_points.py new file mode 100644 index 00000000..cfae0afb --- /dev/null +++ b/baekjoon/python/platinum2/q2261_closest_two_points.py @@ -0,0 +1,53 @@ +# https://www.acmicpc.net/problem/2261 +import sys +input = sys.stdin.readline + +n = int(input().rstrip()) +points = [] +for _ in range(n): + x, y = map(int, input().split()) + points.append((x, y)) + +points.sort() + +def get_dis(p1, p2): + return (p1[0] - p2[0]) **2 + (p1[1] - p2[1]) **2 + +def check_dis_all(start, end): + ans = 1e9 + for i in range(start, end): + for j in range(i+1, end+1): + ans = min(ans, get_dis(points[i], points[j])) + return ans + +def cross_dis(start, mid, end, min_dis): + cands = [] + for i in range(start, end+1): + dis = points[i][0] - points[mid][0] + if(dis ** 2 < min_dis): + cands.append(points[i]) + + cands.sort(key=lambda x : x[1]) + + for i in range(len(cands)-1): + for j in range(i+1, len(cands)): + dis = cands[j][1] - cands[i][1] + if dis ** 2 < min_dis: + min_dis = min(get_dis(cands[i], cands[j]), min_dis) + else: + break + return min_dis + +def find_min(start, end): + if end - start + 1 < 4: + return check_dis_all(start, end) + + mid = (start + end) // 2 + ans = min(find_min(start, mid), find_min(mid+1, end)) + ans = min(ans, cross_dis(start, mid, end, ans)) + return ans + +print(find_min(0, len(points)-1)) + + +