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๋ก ์ฃผ์ด์ง๋ค.
๋ํ, ๋ชจ๋ ์ ์ ์ขํ๋ ๊ฐ์ ๊ฒ์ด ์์ด ๋ค๋ฅธ ๊ฒ์ผ๋ก ํ๋ค.
์ถ๋ ฅ
๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ ์ ๊ณฑ์ ์ถ๋ ฅํ์์ค.
๋์ ๋ต
ํธ๋ ๋ฐ์ ์คํจํ์๋ค. ๊ด๋ จ ์๊ณ ๋ฆฌ์ฆ ๋ ๊ณต๋ถํด์ผํจ.
์๊ณ ๋ฆฌ์ฆ
-
์์ ํ์ => ์๊ฐ ์ด๊ณผ๊ฐ ๋๋ ๊ฑธ ์์ง๋ง ํ ๋ฒ ๊ตฌํํด๋ณด์๋ค.
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))
-
๊ธฐ์ค ์ ์ ๋ฆฌ์คํธ์์ ๋นผ๊ณ vector๋ก ๊ณ์ฐํด๋ณผ๊น
์ด์ฐจํผ ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฐ์ ๊ฒ ๊ฐ์
-
๊ฐ๊ฐ์ ์ ๋ค์ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ ํ ์ํ ๋ชจ์ ๋ด์ ์ ๋ง ๋น๊ต๋์์ผ๋ก ๋๋ฉด ์ด๋จ๊น?
๊ทธ๋ ๋ค๋ฉด ์์ ์ง๋ฆ์ ์ด๋ป๊ฒ ๊ตฌํ ๊ฒ์ธ๊ฐ?
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))
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python]๋ฐฑ์ค 6549๋ฒ : ํ์คํ ๊ทธ๋จ์์ ๊ฐ์ฅ ํฐ ์ง์ฌ๊ฐํ (0) | 2020.03.06 |
---|---|
[python]๋ฐฑ์ค 1780๋ฒ : ์ข ์ด์ ๊ฐ์ (0) | 2020.03.06 |
[python]๋ฐฑ์ค 1992๋ฒ : ์ฟผ๋ํธ๋ฆฌ (0) | 2020.02.29 |
[python]๋ฐฑ์ค 1074๋ฒ : Z (0) | 2020.02.21 |
[python]๋ฐฑ์ค 1019๋ฒ : ์ฑ ํ์ด์ง (0) | 2020.02.21 |
Comment