Hello Ocean! ๐ŸŒผ

[go/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ ๋ณธ๋ฌธ

Algorithm

[go/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์„ฌ ์—ฐ๊ฒฐํ•˜๊ธฐ

bba_dda 2022. 2. 8. 20:41
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

https://programmers.co.kr/learn/courses/30/lessons/42861?language=go 

 

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

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์˜ ๋น„์šฉ์ด ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์„ฌ ์‚ฌ์ด์˜ ๋‹ค๋ฆฌ ๊ฑด์„ค ๋น„์šฉ์ด ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋‘ ์„ฌ ์‚ฌ์ด์˜ ๊ฑด์„ค์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ์„ฌ์€ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

n costs return
4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

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

costs๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฉฐ,

์ดˆ๋ก์ƒ‰ ๊ฒฝ๋กœ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ์€ ๋น„์šฉ์œผ๋กœ ๋ชจ๋‘๋ฅผ ํ†ตํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ด๋‹ค.

ํ’€์ด

costs๋ฅผ ๊ฑด์„ค๋น„์šฉ(costs[2])๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ํ›„,

loop๋ฅผ ๋Œ๋ฉด์„œ ๋‹ค๋ฆฌ๋ฅผ ํ•˜๋‚˜์”ฉ ์„ ํƒํ•ด ๋‚˜๊ฐ€๋Š”๋ฐ,

์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

 

์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด, Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์˜€๋‹ค.

๋งค ๊ฒฝ์šฐ์—, find๋ฅผ ์ด์šฉํ•ด ๋‘ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€์ง€ ํ™•์ธํ•ด์ฃผ์—ˆ๋‹ค.

๋ถ€๋ชจ๊ฐ€ ๊ฐ™์œผ๋ฉด ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒจ์Šค,

๊ฐ™์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ๋‹ค๋ฆฌ๋ฅผ ๊ฑด์„คํ•˜๊ณ , ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

 

์ฝ”๋“œ

import "sort"
var parents []int
func solution(n int, costs [][]int) int {
    answer := 0
    parents = make([]int, n+1) 
    for i:=0;i<n;i++ {
        parents[i] = i;
    }
    // costs ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    sort.Slice(costs, func (i, j int) bool {
            return costs[i][2] < costs[j][2]
    })
    
    for _, route:= range(costs) {
        if union(route[0], route[1]) {
            answer += route[2]
        }
    }
    return answer
}

// ์ตœ์ƒ์œ„ ๋ถ€๋ชจ ์ฐพ๊ธฐ
func find(a int) int {
    if a == parents[a] {
        return a
    }
    parents[a] = find(parents[a])
    return parents[a]
}

func union(a, b int) bool {
    a = find(a)
    b = find(b)
    
    // ์‚ฌ์ดํด์ด ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ ํŒจ์Šค
    if (a == b) {
        return false
    }
    // ๋‘ ๋…ธ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ
    if (a > b) {
        parents[a] = b // ์ž‘์€์• ๋ฅผ ํฐ ์• ํ•œํ…Œ ๋‹ฌ๊ธฐ
    } else {
        parents[b] = a
    }
    return true
}

๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•