Algorithm
[Swift 백준] 1389 케빈 베이컨의 6단계 법칙
Kim Roks
2025. 2. 16. 17:35
풀이 아이디어
- 그래프 탐색 문제입니다.
- 트리형태가 아니고, 사이클이 일어날 수 있는 그래프이기 때문에 방문 체크에 유의해야 합니다.
- 각 노드까지의 거리를 담는 배열을 정의하여 bfs 함수 실행 후에 비교하여 최솟값을 찾아냅니다
풀이
import Foundation
let nm = readLine()!.split(separator: " ").map { Int($0)! }
let (n, m) = (nm[0], nm[1])
var graph: [[Int]] = Array(repeating: [], count: n + 1)
for _ in 0..<m {
let input = readLine()!.split(separator: " ").map { Int($0)! }
let (a, b) = (input[0], input[1])
//인접 그래프를 생성합니다
graph[a].append(b)
graph[b].append(a)
}
var minSum = Int.max
var answer = -1
func bfs(start: Int) -> Int {
var isVisited = Array(repeating: false, count: n + 1)
var distance = Array(repeating: 0, count: n + 1)
var q = [start]
isVisited[start] = true
while !q.isEmpty {
let current = q.removeFirst()
for item in graph[current] {
if !isVisited[item] {
q.append(item)
isVisited[item] = true
distance[item] = distance[current] + 1
}
}
}
// 각 노드까지의 거리의 합을 return해줍니다
return distance.reduce(0, +)
}
//반복문을 돌며 비교, 값을 대치해줍니다. 문제에서의 요구사항처럼 최솟값이 두번 이상 나와도 이후 값으로 변경되지않습니다.
for i in 1...n {
let sum = bfs(start: i)
if sum < minSum {
minSum = sum
answer = i
}
}
print(answer)