์ง๊ฒ๋ค๋ฆฌ ์๋ฅผ ๋ฌ๋ฆฌ๋ ๊ฒฝ๊ธฐ๋ฅผ ํ๊ธฐ๋ก ํ๋ค.
์ง๊ฒ๋ค๋ฆฌ๊ฐ ๋์ฌ ์๋ ์์น๋ (x,y) ์์์์ผ๋ก ํํ๋๊ณ ์์์ ์ ์ธ์ ๋ (0,0) ์์ ์ด๋ค.
๊ฒฝ๊ธฐ๊ฐ ์งํ๋๋ ๋์ ํ์ฌ ์์นํ ์ง๊ฒ๋ค๋ฆฌ์ x์ขํ ์ฐจ์ด๊ฐ 2์ดํ์ด๊ณ y์ขํ ์ฐจ์ด๋ 2์ดํ์ธ ์ง๊ฒ๋ค๋ฆฌ๋ก๋ง ์ ํํ ์ ์๋ค. ๊ฒฐ์น์ ์ x์ถ์ ํํํ ์ง์ ์ธ๋ฐ ์ฌ๋ฌ๋ถ์ด ๊ฒฐ์น์ ๊ณผ y์ขํ๊ฐ ๋์ผํ ์ง๊ฒ๋ค๋ฆฌ์ ๋๋ฌํ๋ฉด ๊ฒฐ์น์ ์ ํต๊ณผํ ๊ฒ์ด๋ฏ๋ก ๊ฒฝ๊ธฐ๊ฐ ๋๋๋ค.์ง๊ฒ๋ค๋ฆฌ๋ค์ ์์น๊ฐ ์ฃผ์ด์ง๋ฉด ๊ฒฝ๊ธฐ์์ ์น๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๋ฅผ ์ฐพ์๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๊ณ ์๋ ์ ํ๋ค์ ๊ธธ์ด ํฉ์ด ์ต์์ธ ๊ฒฝ๋ก์ด๋ค. (x1, y1)์ ์์นํ ์ง๊ฒ๋ค๋ฆฌ์์ (x2, y2)์ ์์นํ ์ง๊ฒ๋ค๋ฆฌ๋ก์ ์ ํ๋ ์ ํด๋ฆฌ๋์ ๊ท์น์ ๋ฐ๋ฅธ๋ค.
์ ๋ ฅ๊ฐ์ผ๋ก ์ง๊ฒ๋ค๋ฆฌ ์ n, ๊ฒฐ์น์ y์ขํ F๊ฐ ์ฃผ์ด์ง๊ณ ๋์งธ ์ค๋ถํฐ n๊ฐ์ ์ง๊ฒ๋ค๋ฆฌ๋ค์ ์ขํ๊ฐ ํ ์ค์ ํ๋์ฉ ์ฃผ์ด์ง๋ค. n์ ๋ฒ์๋ [0, 50,000], F๋ ๊ฐ ์ขํ๋ค์ ๋ฒ์๋ [0, 1,000,000]์ผ ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ์์ ์ฒซ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํด ์ ์๋ก ์ถ๋ ฅํ๋๋ก ํ๋ค.๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ -1์ ์ถ๋ ฅํ๋ค.
import sys, math, heapq
input = sys.stdin.readline
n, f = map(int, input().split())
# ์ง๊ฒ๋ค๋ฆฌ ๋ณ ์ขํ, ์ธ๋ฑ์ค ์ ์ฅ
location = [(0, 0, 0)]
# ์ง๊ฒ๋ค๋ฆฌ์์ ์ด๋ ๊ฐ๋ฅํ ํ ๋ค๋ฆฌ ๋ฒํธ ์ธ๋ฑ์ค, ๊ฑฐ๋ฆฌ ์ ์ฅ
graph = [[] for _ in range(n+1)]
# ๋ชฉํ์ง์ ์ธ๋ฑ์ค
target = []
for i in range(1, n+1):
x, y = map(int ,input().split())
location.append((x, y, i))
if y == f:
target.append(i)
visited = set()
# x์ขํ ์ด๋ ํ์ธ
location.sort(key = lambda x: x[0])
for i in range(n+1):
x1, y1, idx1 = location[i]
for j in range(n+1):
x2, y2, idx2 = location[j]
if abs(x1-x2) > 2:
break
elif abs(x1-x2) <= 2 and abs(y1-y2) <= 2:
dist = math.sqrt((x1-x2)**2 + (y1-y2)**2)
graph[idx1].append((idx2, dist))
graph[idx2].append((idx1, dist))
if idx1 < idx2:
visited.add((idx1, idx2))
else:
visited.add((idx2, idx1))
# y์ขํ ๋น๊ต
location.sort(key = lambda x: x[1])
for i in range(n+1):
x1, y1, idx1 = location[i]
for j in range(n+1):
x2, y2, idx2 = location[j]
if abs(y1-y2) > 2:
break
elif abs(x1-x2) <= 2 and abs(y1-y2) <= 2:
if idx1 < idx2 and (idx1, idx2) in visited:
continue
elif idx1 > idx2 and (idx2, idx1) in visited:
continue
dist = math.sqrt((x1-x2)**2 + (y1-y2)**2)
graph[idx1].append((idx2, dist))
graph[idx2].append((idx1, dist))
def dijkstra():
INF = int(1e9)
distance = [INF for _ in range(n+1)]
distance[0] = 0
heap = []
heapq.heappush(heap, (0, 0))
while heap:
now_dist, now_node = heapq.heappop(heap)
if distance[now_node] < now_dist:
continue
for next_node, next_dist in graph[now_node]:
if distance[next_node] > now_dist + next_dist:
distance[next_node] = now_dist + next_dist
heapq.heappush(heap, (now_dist + next_dist, next_node))
answer = INF
for i in target:
answer = min(answer, distance[i])
if answer == INF:
return -1
else:
return round(answer)
print(dijkstra())
< ํด์ค >
์ฐ์ ์ ์ผ๋ก ํ์ฌ ์ขํ๋ฅผ ๋ด์ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ์ํ๊ณ , ์ด๋ฅผ ํ์๋ง๋ค ๋งค๋ฒ ๋น๊ตํด์ค ์์ ์ด ํ์ํ๊ธฐ์ deque ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํด ํ์์ ์ํํด์ผ ๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
ํ์ง๋ง, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํด์ผ ํ๊ธฐ์ BFS, DFS๋ก๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋งค ํ์๋ง๋ค Greedy/Back-Trackingํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ฐ..
์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํด๋ณด๊ณ ์ ํ๋ค.๋ค์ ํ์ด๋ณด๊ธฐ..
(์ค๋ต)