네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.
컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.
n-1
인 정수로 표현합니다.computers
배열을 돌며 Set 에 직접 연결된 네트워크를 set
에 저장한다.sets
에 교집합이 존재하는 set가 있는지 확인한 후,sets
에 insert 하고,sets
에 1번에서 만든 set
를 insert 한다.import Foundation
func solution(_ n:Int, _ computers:[[Int]]) -> Int {
var sets: Set<Set<Int>> = []
if computers.contains(Array(repeating: 1, count: n)) {
return 1
}
for (i, c) in computers.enumerated() {
var set: Set<Int> = [i+1]
for (index, x) in c.enumerated() {
if i != index && x == 1 {
set.insert(index+1)
}
}
var isSame = false
for other in sets {
if !set.intersection(other).isEmpty {
sets.remove(other)
sets.insert(set.union(other))
isSame = true
set = set.union(other)
}
}
if !isSame {
sets.insert(set)
}
}
return sets.count
}
import Foundation
func solution(_ n:Int, _ computers:[[Int]]) -> Int {
var answer = 0
var visited: [Bool] = Array(repeating: false, count: n)
func dfs(_ vertex: Int) {
visited[vertex] = true
for i in 0..<n {
if computers[vertex][i] == 1 && !visited[i] {
dfs(i)
}
}
}
for i in 0..<n {
if !visited[i] {
answer += 1
dfs(i)
}
}
return answer
}
풀이1은 내가 작성한 코드이고, 풀이2는 다른 개발자 코드이다.
풀이1과 풀이2의 실행 결과를 비교해보니, 풀이1보다 풀이2의 실행 속도가 더 빨랐다!
이 문제 주제가 bfs/dfs 였는데 dfs 말고도 다른 방법으로 풀 수 있다는 걸 경험했다 ㅎㅎ 👍🏻