let n = 6
let edge = [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]]
3
이 문제는 bfs 알고리즘으로 푼다.
주어진 간선(edge) 배열을 통해 연결 dict를 만든다. 어느 노드에 어느 노드들이 연결되어 있는지를 저장한다.
let connections = [1: [3, 2], 2: [3, 1, 4, 5], 3: [6, 4, 2, 1], 4: [3, 2], 5: [2], 6: [3]]
구현한 코드는 다음과 같다.
var connections: [Int: [Int]] = [:]
func getConnections(_ key: Int, _ value: Int) {
if connections[key] != nil {
connections[key]?.append(value)
} else {
connections[key] = [value]
}
}
for e in edge {
getConnections(e[0], e[1])
getConnections(e[1], e[0])
}
방문 여부를 저장하는 visited 배열, 방문할 노드들을 저장하는 queue 배열, depth에 어떤 노드들이 있는지 저장하는 db 딕셔너리를 만든다.
큐에는 노드를 (노드 번호, depth) 형태로 저장한다.
db에는 [깊이: [해당 노드들]] 형태로 저장한다.
var visited: [Bool] = Array(repeating: false, count: n+1)
var queue: [(Int, Int)] = [] // (node, depth)
var db: [Int: [Int]] = [:]
from은 시작 노드 번호이고 depth는 그래프 깊이값이다. 1에서 시작할 때를 생각해보자. from은 1이고 depth는 0이다.
let connections = [1: [3, 2], 2: [3, 1, 4, 5], 3: [6, 4, 2, 1], 4: [3, 2], 5: [2], 6: [3]]
func bfs(_ from: Int, _ depth: Int) {
guard connections[from] != nil else { return }
for node in connections[from]! {
guard !visited[node] else { continue }
visited[node] = true
queue.append((node, depth))
if db[depth] != nil {
db[depth]?.append(node)
} else {
db[depth] = [node]
}
}
}
queue.append((1, 0))
visited[0] = true
visited[1] = true
while !queue.isEmpty {
let node = queue.removeFirst()
bfs(node.0, node.1 + 1)
}
1번 노드에서 가장 멀리 떨어진 노드를 찾는 것은, 가장 깊게 있는 노드들을 찾는 것과 마찬가지이다. 최대 깊이를 구한 다음에, 최대 깊이를 key로 갖는 value들의 갯수를 구해 반환한다.
let maxDepth = db.keys.max() ?? 1
return db[maxDepth]?.count ?? 1
func solution(_ n:Int, _ edge:[[Int]]) -> Int {
var connections: [Int: [Int]] = [:]
func getConnections(_ key: Int, _ value: Int) {
if connections[key] != nil {
connections[key]?.append(value)
} else {
connections[key] = [value]
}
}
for e in edge {
getConnections(e[0], e[1])
getConnections(e[1], e[0])
}
var visited: [Bool] = Array(repeating: false, count: n+1)
var queue: [(Int, Int)] = [] // (node, depth)
var db: [Int: [Int]] = [:]
func bfs(_ from: Int, _ depth: Int) {
guard connections[from] != nil else { return }
for node in connections[from]! {
guard !visited[node] else { continue }
visited[node] = true
queue.append((node, depth))
if db[depth] != nil {
db[depth]?.append(node)
} else {
db[depth] = [node]
}
}
}
queue.append((1, 0))
visited[0] = true
visited[1] = true
while !queue.isEmpty {
let node = queue.removeFirst()
bfs(node.0, node.1 + 1)
}
let maxDepth = db.keys.max() ?? 1
return db[maxDepth]?.count ?? 1
}