알고리즘 문제 풀이
프로그래머스 - 네트워크
블린더르
2020. 12. 17. 00:12
index를 set 으로 만들어서 겹치는 부분이 있는 경우 합치는 방식으로 풀었습니다.
/*
* 2020-12-16
* https://programmers.co.kr/learn/courses/30/lessons/43162
*/
fun network(n: Int, computers: Array<IntArray>): Int {
// index set 의 set 생성
val networkSet: Set<Set<Int>> = computers.map { c ->
c.toList().mapIndexedNotNull { i, n ->
if (n == 1) {
i
} else {
null
}
}.toSet()
}.toSet()
println(networkSet)
// 네트워크 set 의 set 생성
val networkResultSet: MutableSet<MutableSet<Int>> = mutableSetOf()
// index Set 루프 돌면서 겹치는 index 가 있으면 합치기
networkSet.forEach { set ->
// 네트워크 set 수가 컴퓨터 개수와 같으면 모두 연결된 네트워크이므로 1 반환
if (set.count() == n) {
return 1
}
// 새로운 네트워크가 발견되면 저장할 newSet 생성
val newSet = mutableSetOf<Int>()
// 모든 index Set 끼리 비교
networkSet.forEach {network ->
var isNew = true
println("network:$network")
// 결과 Set 과 겹치는 index 가 있으면 합치기
networkResultSet.forEach {
if ((network intersect it).count() > 0) {
it.addAll(network)
println("result: $it")
isNew = false
}
}
// 결과 Set 에 없고 다른 set 과 겹치는 항목(자기 자신 포함)은 newSet 에 추가
if (isNew && (set intersect network).count() > 0) {
newSet.addAll(network)
println("new: $newSet")
}
}
// newSet 의 크기가 컴퓨터 수와 같으면 1 반환
if(newSet.count() == n){
return 1
}
// newSet 에 데이터가 있으면 결과 Set 에 추가
if (newSet.count() > 0)
networkResultSet.add(newSet)
println("networkList $networkResultSet")
}
println(networkResultSet)
return networkResultSet.count()
}
반응형