[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ / ํŒŒ์ด์ฌ / Python / ํฌ๋ฃจ์Šค์นผ(Kruskal) ์•Œ๊ณ ๋ฆฌ์ฆ˜
Algorithm/Programmers

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ / ํŒŒ์ด์ฌ / Python / ํฌ๋ฃจ์Šค์นผ(Kruskal) ์•Œ๊ณ ๋ฆฌ์ฆ˜

728x90
๋ฐ˜์‘ํ˜•

 

 

๐Ÿ’กsolutions )

๐Ÿ’ฌ '์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ๋…ธ๋“œ(์„ฌ) ์—ฐ๊ฒฐ' -> ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(MST)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ™œ์šฉ ๋ฌธ์ œ๋‹ค.


์‹ ์žฅ ํŠธ๋ฆฌ(Spanning Tree)๋ž€?

๊ทธ๋ž˜ํ”„ ๋‚ด์˜ ๋ชจ๋“  ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ํŠธ๋ฆฌ๋กœ
๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ n-1๊ฐœ๋กœ ์ตœ์†Œ ์—ฐ๊ฒฐ ๋ถ€๋ถ„ ๊ทธ๋ž˜ํ”„์ด๋‹ค. 

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(Minimum Spanning Tree )๋ž€?
์‹ ์žฅ ํŠธ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋œ ๊ฐ„์„ ๋“ค์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ํŠธ๋ฆฌ
์ฆ‰, ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ๋…ธ๋“œ ์—ฐ๊ฒฐํ•˜๋Š” ๊ทธ๋ž˜ํ”„์ด๋‹ค.

์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ


๐Ÿ’ฌ ๋จผ์ € ๋‹ค๋ฆฌ ๊ฑด์„ค ๋น„์šฉ ๊ธฐ์ค€์œผ๋กœ costs๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ๋‹ค. -> ์ ์€ ๋น„์šฉ์˜ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊บผ๋‚ด์™€์„œ ์—ฐ๊ฒฐํ•œ๋‹ค.

๐Ÿ’ฌ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ์ฐพ๋Š” find_parent๋ฅผ ํ†ตํ•ด ๊บผ๋‚ด์˜จ ๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ->์‚ฌ์ดํด์ด ์ƒ๊ธฐ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋งŒ union_parent()ํ•จ์ˆ˜๋กœ ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
๐Ÿ’ฌ ๋…ธ๋“œ ์—ฐ๊ฒฐ ํ›„ ๋ฐœ์ƒํ•œ ๋น„์šฉ๋งŒํผ answer์— ๋”ํ•ด์ค€๋‹ค.

 

 

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ๊ณ ํ•œ ์ž๋ฃŒ ๐Ÿ‘‡

 ๋™๋นˆ๋‚˜๋‹˜์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ•์˜์™€ ๋ธ”๋กœ๊ทธ

 

 

๐Ÿ‘จ‍๐Ÿ’ปcode )

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

def solution(n, costs):

    def find_parent(parent, n):
        if parent[n] != n:
            parent[n] = find_parent(parent, parent[n])
        return parent[n]
    
    def union_parent(parent, a, b):
        a = find_parent(parent, a)
        b = find_parent(parent, b)
        if a > b:
            parent[a] = b
        else:
            parent[b] = a
    
    answer = 0 
    costs.sort(key=lambda x:x[2])  # ๋น„์šฉ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    parent = [i for i in range(n)]

    for node_a, node_b, cost in costs:
        if find_parent(parent, node_a) != find_parent(parent, node_b):
            union_parent(parent, node_a, node_b)
            answer += cost

    return answer

 

๐Ÿฅ๋‹ค๋ฅธ ํ’€์ด

def solution(n, costs):
    costs = sorted(costs, key=lambda x:x[2])
    node = set([costs[0][0], costs[0][1]])
    answer = costs[0][2]

    while len(node) != n:
        for i in range(1, len(costs)):
            if costs[i][0] in node and costs[i][1] in node:
                continue
            if costs[i][0] in node or costs[i][1] in node:
                node.update([costs[i][0], costs[i][1]])
                answer += costs[i][2]
                break
    return answer

 

 

๐Ÿ“Œdescription )

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

programmers.co.kr


๋ฌธ์ œ ์„ค๋ช…

n๊ฐœ์˜ ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๋ฅผ ๊ฑด์„คํ•˜๋Š” ๋น„์šฉ(costs)์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ตœ์†Œ์˜ ๋น„์šฉ์œผ๋กœ ๋ชจ๋“  ์„ฌ์ด ์„œ๋กœ ํ†ตํ–‰ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค ๋•Œ ํ•„์š”ํ•œ ์ตœ์†Œ ๋น„์šฉ์„ return ํ•˜๋„๋ก solution์„ ์™„์„ฑํ•˜์„ธ์š”.

๋‹ค๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑด๋„ˆ๋”๋ผ๋„, ๋„๋‹ฌํ•  ์ˆ˜๋งŒ ์žˆ์œผ๋ฉด ํ†ตํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋ด…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด A ์„ฌ๊ณผ B ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๊ฐ€ ์žˆ๊ณ , B ์„ฌ๊ณผ C ์„ฌ ์‚ฌ์ด์— ๋‹ค๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด A ์„ฌ๊ณผ C ์„ฌ์€ ์„œ๋กœ ํ†ตํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ์‚ฌํ•ญ

  • ์„ฌ์˜ ๊ฐœ์ˆ˜ n์€ 1 ์ด์ƒ 100 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • costs์˜ ๊ธธ์ด๋Š” ((n-1) * n) / 2์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ž„์˜์˜ i์— ๋Œ€ํ•ด, costs[i][0] ์™€ costs[i] [1]์—๋Š” ๋‹ค๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐ๋˜๋Š” ๋‘ ์„ฌ์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋“ค์–ด์žˆ๊ณ , costs[i] [2]์—๋Š” ์ด ๋‘ ์„ฌ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋‹ค๋ฆฌ๋ฅผ ๊ฑด์„คํ•  ๋•Œ ๋“œ๋Š” ๋น„์šฉ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ™์€ ์—ฐ๊ฒฐ์€ ๋‘ ๋ฒˆ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ ๊ฐ™์€ ์—ฐ๊ฒฐ๋กœ ๋ด…๋‹ˆ๋‹ค. ์ฆ‰ 0๊ณผ 1 ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋น„์šฉ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 1๊ณผ 0์˜ ๋น„์šฉ์ด ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์„ฌ ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ ๊ฑด์„ค ๋น„์šฉ์ด ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋‘ ์„ฌ ์‚ฌ์ด์˜ ๊ฑด์„ค์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์„ฌ์€ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

ncostsreturn

4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

costs๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ, ์ด๋•Œ ์ดˆ๋ก์ƒ‰ ๊ฒฝ๋กœ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋ชจ๋‘๋ฅผ ํ†ตํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.




๋ฐ˜์‘ํ˜•