https://www.acmicpc.net/problem/16398
16398번: 행성 연결
홍익 제국의 중심은 행성 T이다. 제국의 황제 윤석이는 행성 T에서 제국을 효과적으로 통치하기 위해서, N개의 행성 간에 플로우를 설치하려고 한다. 두 행성 간에 플로우를 설치하면 제국의 함
www.acmicpc.net
<문제>
<풀이>
모든 행성을 연결해야 하고, 그 비용을 최소로 하려면 최소 스패닝 트리(MST)를 찾아야 한다.
따라서 알고리즘의 흐름은 다음과 같아진다.
1. 2차원 배열로 입력받은 플로우 관리비용을 정렬한다.
2. Kruskal 알고리즘을 이용해 최소 스패닝 트리를 구한다.
여기서 에지(플로우 관리비용)의 정보가 2차원 배열로 입력되므로 배열을 순회하여 (노드, 노드, 비용)꼴의 튜플 배열로 만들어 정렬했다.
2차원 배열의 각 인덱스가 노드를 특정하므로 이렇게 하는 것이 최선이라 생각했다.
<코드>
//
// main.swift
// BOJalgorithm
//
// Created by KellyChui on 2023/02/24.
//
func find(_ a: Int) -> Int {
if parent[a] != a {
parent[a] = find(parent[a])
}
return parent[a]
}
func union(_ a: Int, _ b: Int) {
let pa = find(a)
let pb = find(b)
if pa < pb {
parent[pb] = pa
} else {
parent[pa] = pb
}
}
import Foundation
let n = Int(readLine()!)!
var graph: [[Int]] = []
var edges: [(Int, Int, Int)] = []
var parent = Array(0..<n)
var answer: Int = 0
for _ in 0..<n {
graph.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
for row in 0..<n {
for column in 0..<row {
edges.append((row, column, graph[row][column]))
}
}
edges.sort(by: { $0.2 < $1.2 } )
for edge in edges {
if find(edge.0) != find(edge.1) {
union(edge.0, edge.1)
answer += edge.2
}
}
print(answer)
'Problem Solving > Swift' 카테고리의 다른 글
[백준]BOJ 14502 - 연구소 - Swift/BFS & DFS (0) | 2023.07.05 |
---|---|
[백준]BOJ 1049 - 기타줄 - Swift/Greedy (0) | 2023.06.16 |
[백준]BOJ 11000 - 강의실 배정 - Swift/Greedy (1) | 2023.06.16 |
[Programmers] Lv.2 하노이의 탑 - Swift (0) | 2023.05.03 |
[백준]BOJ 4195 - 친구 네트워크 - Swift/Union-Find Set (0) | 2023.02.23 |
댓글