๐ŸŒžโญ๐ŸŒœ๐ŸŒˆ
๋‰ด์ฐจํŠธ
๐ŸŒžโญ๐ŸŒœ๐ŸŒˆ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
    • Flutter
    • Android
    • Algorithm
      • Python
    • Test
    • Python
    • ์ƒ์‚ฐ์„ฑ
    • ๊ฒฝ์ œ
    • ์˜์–ด
    • ์ƒํ™œ ํŒ

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

ํƒœ๊ทธ

  • getx
  • Flutter Web
  • Python ๋‚ด์žฅ ํ•จ์ˆ˜
  • ๋„ค์ด๋น„ ์”ฐ ์ผ์ฐ ์ž๋Š” ๋ฒ•
  • Flutter pattern
  • flutter
  • enum
  • ๋ผ์ดํ”„ํ•ดํ‚น์Šค์ฟจ
  • null safety
  • flutter webview
  • ํŒŒ์ด์ฌ
  • ํŠน์ง•
  • ์ฐฝ์—…๋ถ€ํŠธ์บ ํ”„
  • PYTHON
  • python ๋‚ด์žฅํ•จ์ˆ˜
  • Flutter ๊ณผ๊ฑฐ
  • bloc
  • cruscal
  • flutter 2.0
  • ์ฐฝ๋ถ€์บ 
  • Firebase
  • Image.memory
  • ๊ฐ“์ƒ
  • ์ผ์ฐ ์ž๋Š” ๋ฒ•
  • Flutter ๊ธฐ์ดˆ ์‹œ๋ฆฌ์ฆˆ
  • Flutter ์˜ ์—ญ์‚ฌ
  • Android
  • Flutter ๋ฏธ๋ž˜
  • Flutter ํ˜„์žฌ
  • AssetThumb

์ตœ๊ทผ ๋Œ“๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๐ŸŒžโญ๐ŸŒœ๐ŸŒˆ

๋‰ด์ฐจํŠธ

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Python
Algorithm/Python

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Python

2021. 9. 28. 20:15

์˜ค๋Š˜์€ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์†ํ•˜๋Š”๋ฐ์š”.

์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์ตœ์†Œ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์€ ์•„๋ž˜์˜ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑ๋์Šต๋‹ˆ๋‹ค.

  • ์•ˆ๊ฒฝ์žก์ด ๊ฐœ๋ฐœ์ž (ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜)
  • ์œ„ํ‚ค๋ฐฑ๊ณผ (ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜)
  • Union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜ (sunghyunpatricklee)

 

์ด ๊ธ€์—์„œ ์•Œ์•„๋ณผ ๋‚ด์šฉ

  • ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€
  • ํ•ต์‹ฌ ์•„์ด๋””์–ด
  • ์˜ˆ์ œ ๋ฌธ์ œ
  • ๋งˆ์น˜๋ฉด์„œ

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€

"MST (Minimum Spanning Tree) ๋ฅผ ์ฐพ๊ธฐ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜". ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๋ช…ํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด MST ๋Š” ๋„๋Œ€์ฒด ๋ฌด์—‡์ผ๊นŒ์š”? "๊ทธ๋ž˜ํ”„์˜ ๋…ธ๋“œ๋“ค์„ ๊ฐ€์žฅ ์ ์€ ์—ฐ๊ฒฐ, ๋น„์šฉ์œผ๋กœ ๋ชจ๋‘ ์—ฐ๊ฒฐํ•œํŠธ๋ฆฌ". ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ ํšจ๊ณผ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. 

 

ํ•ต์‹ฌ ์•„์ด๋””์–ด

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์†ํ•ด์žˆ๋Š” ๋ถ„๋ฅ˜์ž…๋‹ˆ๋‹ค. ๋งค ์ˆœ๊ฐ„ ์ตœ์„ ์˜ ๊ฐ’์„ ์„ ํƒํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ „๊ฐœํ•˜์ฃ . ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ๊ฐ€์žฅ ์ž‘์€ ๊ฐ€์ค‘์น˜ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ์š”? ์ •๋ง ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹ค์šด ๋ฐœ์ƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑธ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. Minimum ์€ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ. Spanning Tree ๋Š” ๊ตฌํ˜„์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. Spanning Tree ๋Š” (Node ์˜ ์ˆ˜ - 1) ์˜ ๊ฐ„์„ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Spanning Tree ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค.

 

 

์™ผ์ชฝ ๊ทธ๋ฆผ์€ ์‚ฌ์ดํด์„ ํ˜•์„ฑํ•œ ๊ทธ๋ž˜ํ”„์˜ ๊ทธ๋ฆผ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ฐ˜๋ฉด ์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์€ (Node - 1) ์˜ ๊ฐ„์„  ์ˆซ์ž๋ฅผ ๊ฐ€์ง„ Spanning Tree ์ž…๋‹ˆ๋‹ค. Spanning Tree ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ์‹ธ์ดํด์„ ์•ˆ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‹ธ์ดํด์„ ์•ˆ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”? 

 

Union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํšจ๊ณผ์ ์œผ๋กœ ์‹ธ์ดํด์„ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Union find ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํšจ๊ณผ์ ์œผ๋กœ ๊ทธ๋ฃน์„ ํ˜•์„ฑ ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ฑด ์ œ๊ฐ€ ์ž‘์„ฑํ•œ Union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ด์ฃผ์„ธ์š”. ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์—ฐ๊ฒฐ๋๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ๋ฐ ํ•œ๋ฒˆ ๋” ์—ฐ๊ฒฐํ•˜๊ฒŒ ๋˜๋ฉด ์‹ธ์ดํด์ด ํ˜•์„ฑ๋˜๊ฒ ์ฃ . ๋”ฐ๋ผ์„œ ๊ฐ™์€ ๊ทธ๋ฃน์— ์†ํ–ˆ๋‹ค๋ฉด ์—ฐ๊ฒฐ์„ ํ•˜์ง€ ์•Š๊ณ . ์†ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์•„์ง ์—ฐ๊ฒฐ์ด ์•ˆ๋๋‹ค๋Š” ๋œป์ด๋‹ˆ ์—ฐ๊ฒฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” Spanning Tree๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ž‘์€ ๊ฐ€์ค‘์น˜ ์ˆœ์„œ๋Œ€๋กœ ์ •์ ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋˜. ์‹ธ์ดํด์„ ํ™•์ธํ•˜๋ฉด์„œ ์—ฐ๊ฒฐํ•˜๋ฉด. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์™„์„ฑ์ด์ž MST ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์ œ ๋ฌธ์ œ

์˜ˆ์ œ ๋ฌธ์ œ๋กœ๋Š” ๋ฐฑ์ค€ ๋ฌธ์ œ 10021 (Watering the fields) ๋ฅผ ๊ฐ„๋žตํ™” ํ•ด์„œ ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.[[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8]] ๋ชจ๋‘๋ฅผ ์ตœ์†Œ๋น„์šฉ์œผ๋กœ ์—ฐ๊ฒฐํ•œ ๊ฐ’์€ ์–ผ๋งˆ์ผ๊นŒ์š”? ๊ฐ ๋…ธ๋“œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๋Š” ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋กœ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹น์—ฐํžˆ sqrt(98) ์ผ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฑธ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ MST ๋ฅผ ๋งŒ๋“ค์–ด ํ’€์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

import heapq
from math import sqrt

def find(par, uf_list):
    if(uf_list[par] < 0): return par
    else:
        uf_list[par] = find(uf_list[par], uf_list)
        return uf_list[par]

def union(f, t, uf_list):
    from_ = find(f, uf_list)
    to = find(t, uf_list)

    if(from_ < to):
        uf_list[to] = from_
    else:
        uf_list[from_] = to

def calc_Euclidean_distance(x1, y1, x2, y2):
    x = x1 - x2
    y = y1 - y2

    return sqrt(x**2 + y**2)

fields = [[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6], [7, 7], [8, 8]]
node = 8
result = 0
hqueue = list()
uf_list = [-1] * 8
edge_count = 0

for i in range(node-1):
    for j in range(node):
        distance = calc_Euclidean_distance(fields[i][0], fields[i][1], fields[j][0], fields[j][1])
        heapq.heappush(hqueue, (distance, i, j)) # ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ๊บผ๋‚ด๊ธฐ

while hqueue:
    distance, from_, to = heapq.heappop(hqueue)

    f = find(from_, uf_list)
    t = find(to, uf_list)

    if(f == t):
        continue

    union(from_, to, uf_list)
    result += distance
    edge_count += 1


print("minimum distance :", result) # sqrt(98) = 9.899494936611667 
print("count of edges :", edge_count)

 

์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•ด์„œ. ๊ฐ€์žฅ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์ˆœ์„œ๋Œ€๋กœ ์ฐจ๋ก€๋Œ€๋กœ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์œ„์—์„œ ์ด๋ฏธ ์„ค๋ช…ํ–ˆ๋“ฏ์ด. Union-find ๋ฅผ ์ด์šฉํ•ด ์‹ธ์ดํด์„ ์ฒดํฌํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๋งˆ์น˜๋ฉด์„œ

์–ธ์ œ๋‚˜ ํ”ผ๋“œ๋ฐฑ์€ ํ™˜์˜์ž…๋‹ˆ๋‹ค. ๊ธด๊ธ€ ์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ˜น์‹œ ์•Œ๊ณ ์‹ถ์œผ์‹  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์œผ์‹œ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~~

'Algorithm > Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋ฐฑ์ค€ 11000๋ฒˆ - ๊ฐ•์˜์‹ค ๋ฐฐ์ •  (0) 2022.02.24
Union find ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Python  (0) 2021.09.29
    'Algorithm/Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋ฐฑ์ค€ 11000๋ฒˆ - ๊ฐ•์˜์‹ค ๋ฐฐ์ •
    • Union find ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Python
    ๐ŸŒžโญ๐ŸŒœ๐ŸŒˆ
    ๐ŸŒžโญ๐ŸŒœ๐ŸŒˆ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”