[python]๋ฐฑ์ค€ 5620๋ฒˆ : ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ์ ์˜ ๊ฑฐ๋ฆฌ

https://www.acmicpc.net/problem/5620

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งž์€ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 1700 558 294 40.664%

๋ฌธ์ œ

ํ‰๋ฉด์ƒ์— n๊ฐœ์˜ ์  (P1, .... , Pn) ์ด ๋†“์—ฌ์ ธ์žˆ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ๊ฑฐ๋ฆฌ๊ฐ€ ์ตœ์†Œ์ธ ๋‘ ๊ฐœ์˜ ์ ์„ ๊ตฌํ•˜๊ณ  ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์€ ์ฒซ ๋ฒˆ์งธ ์ค„์— ์ •์ˆ˜๋กœ ๋œ ์ ์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ n+1๋ฒˆ์งธ ์ค„๊นŒ์ง€ 2๊ฐœ์˜ ์ •์ˆ˜ x,y๊ฐ€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

i+1๋ฒˆ์งธ ์ค„์€ Pi ์˜ x,y ์ขŒํ‘œ๋ฅผ ์˜๋ฏธํ•˜๊ณ  n๊ฐœ์˜ ์ ์— ๋Œ€ํ•ด์„œ ์ฃผ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

์ ์˜ ๊ฐœ์ˆ˜๋Š” 2 โ‰ฆ n โ‰ฆ 500000 , ์ขŒํ‘œ์˜ ๋ฒ”์œ„๋Š” -10000 โ‰ฆ x,y โ‰ฆ10000๋กœ ์ฃผ์–ด์ง„๋‹ค.

๋˜ํ•œ, ๋ชจ๋“  ์ ์˜ ์ขŒํ‘œ๋Š” ๊ฐ™์€ ๊ฒƒ์ด ์—†์ด ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.

์ถœ๋ ฅ

๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ์˜ ์ œ๊ณฑ์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

๋‚˜์˜ ๋‹ต

ํ‘ธ๋Š” ๋ฐ์— ์‹คํŒจํ•˜์˜€๋‹ค. ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋” ๊ณต๋ถ€ํ•ด์•ผํ•จ.

์•Œ๊ณ ๋ฆฌ์ฆ˜
  1. ์™„์ „ ํƒ์ƒ‰ => ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋˜๋Š” ๊ฑธ ์•Œ์ง€๋งŒ ํ•œ ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

    import math
    
    num = int(input())
    point_list = list()
    
    for i in range(0,num):
        point_list.append(list(map(int,input().split())))
    
    def distance(points,min):
        if len(points)==1:
            return min
        x = points[0][0]
        y = points[0][1]
        points=points[1:]
        for point in points:
            tmp = pow(x-point[0],2)+pow(y-point[1],2)
            if tmp ==1:
                return 1
            if tmp<min:
                min = tmp
        return distance(points,min)
    
    print(distance(point_list,987654321))
  2. ๊ธฐ์ค€ ์ ์„ ๋ฆฌ์ŠคํŠธ์—์„œ ๋นผ๊ณ  vector๋กœ ๊ณ„์‚ฐํ•ด๋ณผ๊นŒ

    ์–ด์ฐจํ”ผ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๊ฐ™์„ ๊ฒƒ ๊ฐ™์Œ

  3. ๊ฐ๊ฐ์˜ ์ ๋“ค์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ ์–ด๋– ํ•œ ์›ํ˜• ๋ชจ์–‘ ๋‚ด์˜ ์ ๋งŒ ๋น„๊ต๋Œ€์ƒ์œผ๋กœ ๋‘๋ฉด ์–ด๋–จ๊นŒ?

    ๊ทธ๋ ‡๋‹ค๋ฉด ์›์˜ ์ง€๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ•  ๊ฒƒ์ธ๊ฐ€?

    x์ •๋ ฌ ํ•œ ๋ฐฐ์—ด์—์„œ ํ•ด๋‹น ์ ๊ณผ ๋‹ค์Œ ์ธ๋ฑ์Šค์˜ ์  ์‚ฌ์ด ๊ฑฐ๋ฆฌ๋ฅผ ์ง€๋ฆ„์œผ๋กœ ๋‘์ž

    sorting๋ถ€ํ„ฐ O(n^2)์ด๋‹ค.

import math

num = int(input())
point_list = list()

for i in range(0,num):
    point_list.append(list(map(int,input().split())))

def xSorting(arr):
    tmp_arr = list()
    tmp_arr.append(arr[0])
    for i in range(1,len(arr)):
        index = i
        for j in range(i-1,-1,-1):
            if tmp_arr[j][0]>arr[i][0]:
                index = j
        tmp_arr.insert(index,arr[i])
    return tmp_arr

def ySorting(arr):
    tmp_arr = list()
    tmp_arr.append(arr[0])
    for i in range(1,len(arr)):
        index = i
        for j in range(i-1,-1,-1):
            if tmp_arr[j][1]>arr[i][1]:
                index = j
        tmp_arr.insert(index,arr[i])
    return tmp_arr

def calMinDist(arr):
    tmp_arr = list()
    for i in range(0,len(arr)-1):
        x_dist = abs(arr[i+1][0]-arr[i][0])
        y_dist = abs(arr[i+1][1]-arr[i][1])
        if x_dist>y_dist:
            tmp_arr.append(x_dist)
        else:
            tmp_arr.append(y_dist)
    return tmp_arr

def makeCandidate(arr,xs):
    tmp_arr = list()
    for i in range(0,len(xs)):
        tmp = list()
        for obj in xs[i+1:]:
            if abs(obj[0]-xs[i][0])<=arr[i]:
                if abs(obj[1]-xs[i][1])<=arr[i]:
                    tmp.append(obj)
            else:
                break
        tmp_arr.append(tmp)
    return tmp_arr

def minResult(candid, xs):
    min = 987654321
    for i in range(0,len(candid)):
        for obj in candid[i]:
            tmp = pow(xs[i][0]-obj[0],2)+pow(xs[i][1]-obj[1],2)
            if tmp<min:
                min = tmp
    return min

x_sort = xSorting(point_list)
y_sort = ySorting(point_list)

min_arr = calMinDist(x_sort)
candid = makeCandidate(min_arr,x_sort)
print(minResult(candid,x_sort))

๋‹ค๋ฅธ ๋‹ต

https://dundung.tistory.com/52

์ด ๋ธ”๋กœ๊ทธ์˜ ๋‹ต์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ธ๋“ฏ ์‹ถ๋‹ค.

x์ •๋ ฌ ํ›„ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์ด์šฉํ•˜์—ฌ ๊ฐ€์šด๋ฐ์˜ ์ ๋“ค์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹.

์™œ ์™ผ์ชฝ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ถ„ํ• ํ•  ์ƒ๊ฐ์„ ๋ชปํ–ˆ์„๊นŒ ;-;..

  • ๋ถ„ํ• ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ผ์ธ์Šค์œ„ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ณต๋ถ€ํ•˜๊ธฐ)

๋ผ์ธ ์Šค์œ„ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ํ›„..


์Šค์œ„ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ํŠน์ • ์„ ์ด๋‚˜ ๊ณต๊ฐ„์„ ํ•œ์ชฝ์—์„œ๋ถ€ํ„ฐ ์“ธ์–ด๋ฒ„๋ฆฌ๋Š” ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ•œ ๋ฒˆ๋งŒ ์ „์ฒด ๊ณต๊ฐ„์„ ์Šค์บ”ํ•˜๋ฉด์„œ ์ •๋‹ต์„ ๊ตฌํ•˜๋Š” ํ˜•ํƒœ


๊ฒฐ๊ตญ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ x์ถ• ์ •๋ ฌ ํ›„, ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ๊นŒ์ง€ ํ›‘์œผ๋ฉด์„œ ๋น„๊ต๋ฅผ ํ•˜๋Š” ์‹์œผ๋กœ ์ง„ํ–‰

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋„ ๋ชจ๋“  ์ ์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ans ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š” ์ ๋งŒ ๋น„๊ต

๋”ฐ๋ผํ•ด๋ดค์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋‚˜์˜จ ์ฝ”๋“œ... ๋” ๊ณต๋ถ€ํ•˜์ž

import math

num = int(input())
point_list = list()

for i in range(0,num):
    point_list.append(list(map(int,input().split())))

def xSorting(arr):
    tmp_arr = list()
    tmp_arr.append(arr[0])
    for i in range(1,len(arr)):
        index = i
        for j in range(i-1,-1,-1):
            if tmp_arr[j][0]>arr[i][0]:
                index = j
        tmp_arr.insert(index,arr[i])
    return tmp_arr

def ySorting(arr):
    tmp_arr = list()
    tmp_arr.append(arr[0])
    for i in range(1,len(arr)):
        index = i
        for j in range(i-1,-1,-1):
            if tmp_arr[j][1]>arr[i][1]:
                index = j
        tmp_arr.insert(index,arr[i])
    return tmp_arr

def calDist(p1,p2):
    dist = pow(p1[0]-p2[0],2)+pow(p1[1]-p2[1],2)
    return dist


def makeCandidate(arr,bound,min):
    tmp_arr = list()
    x = arr[bound][0]
    y = arr[bound][1]
    for i in range(bound-1,-1,-1):
        if abs(x-arr[i][0])<min:
            if abs(y-arr[i][1])<min:
                tmp_arr.append(arr[i])
        else:
            return tmp_arr
    return tmp_arr

def minResult(arr):
    min = 987654321
    for i in range(1,len(arr)):
        candidate = makeCandidate(arr,i,min)
        for obj in candidate:
            dist = calDist(arr[i],obj)
            if dist ==1:
                return 1
            if dist<min:
                min = dist
    return min

x_sort = xSorting(point_list)
print(minResult(x_sort))
๋ฐ˜์‘ํ˜•