코딩테스트
케빈 베이컨의 6단계 법칙
dofury
2023. 7. 25. 22:42
728x90
package com.dofury.kotlin
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
class Graph(numVertices: Int){
var adjLists: Array<MutableSet<Int>> = Array(numVertices+1) { mutableSetOf() }
fun addEdge(src: Int, dest:Int) {
adjLists[src].add(dest)
}
}
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.`out`))
val results = mutableMapOf<Int, Int>()
val (userCount, relationCount) = br.readLine().split(' ').map { it.toInt() }
val g = Graph(userCount)
repeat(relationCount){
val (start, dest) = br.readLine().split(' ').map { it.toInt() }
g.addEdge(start,dest)
g.addEdge(dest,start)
}
repeat(userCount){i ->
val visited = BooleanArray(userCount+1)
results[i+1] = bfs(g,i+1,visited)
}
val min = results.minOf { it.value }
val result = results.filter { it.value == min }.minByOrNull { it.key }?.key
bw.append(String.format("%d",result))
bw.flush()
bw.close()
br.close()
}
private fun bfs(graph: Graph,v: Int,visited: BooleanArray): Int{
val queue = ArrayDeque<Int>()
val distance = IntArray(visited.size) {0}
visited[v] = true
distance[v] = 0
queue.addLast(v)
while (!queue.isEmpty()){
val n = queue.removeFirst()
for(i in graph.adjLists[n]){
if(!visited[i]){
queue.addLast(i)
visited[i] = true
distance[i] = distance[n] +1
}
}
}
return distance.sum()
}
처음에 문제를 보자마자 그래프를 사용해 풀어야하는 문제인것을 알았으나 구현하는 방법을 몰라서 애를 먹었다.
그래서 그래프 관련 문서를 참고해 구현하였으나, BFS, DFS 중 무엇으로 탐색할지도 생각해야했다.
허나 DFS로는 구현하면 그 값이 최단거리 값을 도출하지못하는 문제가 생겨서 인접한것을
우선으로 탐색하는 BFS를 사용하였다.
그리고 케빈 베이컨수를 구하려고 하였으나 어떻게 구할지 생각하던 찰나 베이컨의 수는 시작 노드에서 다른 노드들의 거리의 합이라는것을 깨달았다.
728x90