01) λ¬Έμ
2μ°¨μ νλ©΄μμ nκ°μ μ μ΄ μ£Όμ΄μ‘μ λ, μ΄ μ λ€ μ€ κ°μ₯ κ°κΉμ΄ λ μ μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€. 첫째 μ€μ μμ°μ n(2 β€ n β€ 100,000)μ΄ μ£Όμ΄μ§λ€. λ€μ nκ°μ μ€μλ μ°¨λ‘λ‘ κ° μ μ x, yμ’νκ° μ£Όμ΄μ§λ€. κ°κ°μ μ’νλ μ λκ°μ΄ 10,000μ λμ§ μλ μ μμ΄λ€. μ¬λ¬ μ μ΄ κ°μ μ’νλ₯Ό κ°μ§ μλ μλ€.
μμ μ /μΆλ ₯
4
0 0
10 10
0 10
10 0
# output is 100
02) νμ΄
- νλ©΄μ λΆν νλ€
- λΆν λ νλ©΄μμ μ΅μ 거리λ₯Ό μ°Ύλλ€
- μλ‘ λΆν λμ΄ μλ μ λ€ μ€μμ μ΅μ κ±°λ¦¬κ° λ μ μλ μ λ€λ§ νμνμ¬ μ΅μ 거리λ₯Ό κ°±μ νλ€.
μ΄μ μκ³ λ¦¬μ¦ μμ μμ λΆλͺ ν μ νλ λ¬Έμ μΈλ°λ λ°λ‘ ꡬνμ΄ λ μ€λ₯΄μ§ μμλ€. μμ κ°μ νλ¦μΌλ‘ divide/combine νλ©΄ λκ² κ΅¬λ νλ μκ°μ λ€μμ§λ§, 3λ² combine λ¨κ³λ₯Ό μ΄λ»κ² ꡬνν μ μμμ§ κ³ λ―Όμ΄ λμλ€. (μ΄λμ κΈ°μ΅μ μμ‘΄ν΄ νλ©΄ μ λλ€.)
μ²μμλ leftμ rightμμ κ°κ° yμ’νμ μ λκ°μ΄ κ°μ₯ μμ λ μ a, bλ₯Ό μ νν΄, μ΄μ xκ°μ κΈ°μ€μΌλ‘ μ¬μ΄μ μλ μ λ§ νμνλ©΄ μ΄λ¨κΉ? νλ μκ°μ΄ λ€μλ€. λΉμ°ν νλ Έλ€. μλμ κ°μ λ°λ‘κ° μ‘΄μ¬νλ€.
κ²°κ΅ κ΅μ¬λ₯Ό λ³΄κ³ , combineμ μ κ·Όλ²μ μκ² λμλ€. μ΅μ 거리λ₯Ό μ°Ύμ ν, midμ xμ’νλ₯Ό κΈ°μ€μΌλ‘ xμ’νκ° +/-d μΈ κ²½μ°μλ§ κ²μμ λ²μκ° λλ€. λ§μ½ xμ’νκ° κ²½κ³μ μμ μ΄λ―Έ μ΅μ거리 dλ₯Ό μ΄κ³Όνμ¬ λ¨μ΄μ Έ μλ€λ©΄ μ΄λ€ κ²½μ°μλ λ€λ₯Έ μͺ½μ μλ μ κ³Ό μ΅μ거리λ₯Ό μ΄λ£° μ μλ€.
<κ·Έλ¦Ό 1>μ L, Rμμ μ΅μ 거리λ₯Ό κ°κ° μ°Ύμ ν, μ΄λ₯Ό d = min(dL, dR) λΌκ³ νλ€. μ€κ°μ μλ μ μ λ²μλ κ·Έλ¦Όκ³Ό κ°μ΄ Mμ΄ λλ€. μ΄ μ€κ° μμμ μ λ€μ μ΄μ€ λ°λ³΅λ¬Έμ μ¬μ©νμ¬ μ΅λ¨κ±°λ¦¬λ₯Ό κ³μ°ν΄λ³΄κ³ , μ΅μκ°μ μ°Ύμ κ°±μ ν΄μ£Όμ΄μΌ νλ€.
μ΄ λ, λ§μ½ μ€κ° μμμ μ λ€μ΄ yμ’νλ₯Ό κΈ°μ€μΌλ‘ μ λ ¬λμ΄ μλ€λ©΄, κ²μ μκ°μ μ€μΌ μ μλ€. (μ ννλ κ²μμ΄ νμ μλ κ²½μ°λ₯Ό μ²λ¦¬ν΄μ€ μ μλ€.) λ§μ½ iμ κ³Ό jμ μ yμ’ν Yi, Yjμ μ°¨κ° νμ¬κΉμ§ κ°±μ λ μ΅μ거리 dλ³΄λ€ ν° κ²½μ°, Xi, Xjμ κ°μ μκ΄μμ΄ λ μ μ 거리λ νμ dλ³΄λ€ ν¬κ±°λ κ°κ² λλ€.
$\ distance = \sqrt{(X_i - X_j)^2 + (Y_i - Y_j)^2} $
λ°λΌμ λ€μκ³Ό κ°μ λ°©λ²μ μ μ©ν μ μλ€.
for i in 0 to n-1:
for j in i+1 to n:
if j.y - i.y >= minD:
break
else minD = min(minD, distance(i, j)) # update
μνμ°©μ€: λ΄μ₯ν¨μμ μ¬μ© μ μ£Όμ π¨
μμ κ°μ΄ μ½λλ₯Ό μμ±νλλ°, μ΄λ²μ 'μκ° μ΄κ³Ό'κ° λ¨κ³ λ§μλ€. μ€κ° μμμ λ²μ μΈλ±μ€λ₯Ό ꡬνλ κ³Όμ μμ yμ’νλ₯Ό κΈ°μ€μΌλ‘ λ΄λ¦Όμ°¨μ μ λ ¬μ νκ³ μΆμλ보λ€. sort(key, reversed=True)
λ₯Ό μ€μ νλ λ°λμ μ΄μ΄μκ²λ μκ° λ¦¬λ°μ λμ΄λ²λ Έλ€. λ¨Έλ¦Ώμμμ μκ°ν κ³Όμ μ μ무 μκ° μμ΄ μ½λλ‘ μμ±νκΈ°μ, κ΅³μ΄ νμλ μλ μμ λ ¬ μ΅μ
μ κ±Έμ΄ μ€ κ²μ΄λ€. λ, μ λ ¬μ μλ°©ν₯μΌλ‘ νλ κ²μ΄ λ μ€λ 걸릴 κ²μ΄λΌλ μκ°μ νμ§ λͺ»νλλ°, μ€μ λ‘λ reversed=True
μ΅μ
μ΄ μΈνμ΄ μ»€μ§λ κ²½μ° μ±λ₯μ μν₯μ μ€ μ μλ€κ³ νλ€. μκ° λλ λ©λͺ¨λ¦¬ μ΄κ³Όμ μκΈ°λ₯μ νμμ μ무 μκ° μμ΄ μ°λ λ΄μ₯ν¨μμ μλ λ°©μμ λν΄ μ‘°κΈμ΄λλ§ κ΄μ¬μ κ°κ³ μ°Ύμλ³΄κ² λ§λ λ€λ μ μΈ κ² κ°λ€.
03) μ½λ (νμ΄μ¬)
# Closest Pair
import sys
import math
def distance(d1: tuple, d2: tuple): # 거리 μ κ³±
return (d1[0]-d2[0])**2 + (d1[1]-d2[1])**2
def closest_pair(s, e):
global minD
if e - s == 1:
return
if e - s == 2:
d = distance(D[s], D[e-1])
if minD == None or minD > d:
minD = d
return
# xμ’νμ midκ° κ΅¬νκΈ°
mid = (s + e) // 2
closest_pair(s, mid)
closest_pair(mid, e)
d = minD
# mid-d < x < mid+d μ (μ€κ° μμ) μ‘°μ¬
for i in range(mid, s-1, -1):
if D[mid][0] - D[i][0] > math.sqrt(d):
break
for j in range(mid, e):
if D[j][0] - D[mid][0] > math.sqrt(d):
break
# i~j μ€κ° μμμμμ μ΅κ·Όμ μ μ‘°μ¬
mids = sorted(D[i:j+1], key=lambda d: d[1])
for p in range(len(mids)-1):
for q in range(p+1, len(mids)):
if mids[q][1] - mids[p][1] >= math.sqrt(d):
break
minD = min(minD, distance(mids[q], mids[p]))
return
# μ
λ ₯μ λ°μ
N = int(input())
D = [tuple(map(int, sys.stdin.readline().split())) for _ in range(N)]
minD = None
# Dλ°°μ΄μ xμ’νκ°μ κΈ°μ€μΌλ‘ μ λ ¬
D.sort(key=lambda d: d[0])
# μ¬κ· νΈμΆ
closest_pair(0, N)
print(minD)
μ΄λ ΅λ€..νμ΄ν
'DevLog π¨ > Baekjoon' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[DevLog][Baekjoon] 8983: μ¬λ₯κΎΌ (0) | 2023.08.16 |
---|---|
[DevLog][Baekjoon] 2110: 곡μ κΈ° μ€μΉ (0) | 2023.08.16 |
[DevLog][Baekjoon] 1629: κ³±μ (0) | 2023.08.14 |
[BaekJoon] 1007: λ²‘ν° λ§€μΉ (0) | 2023.02.16 |
[BaekJoon] 1005: ACM Craft (0) | 2023.02.14 |