문제
풀이
이 문제는 5명의 친구관계가 연결되어 있는 것을 찾는 문제로, DFS와 백트래킹을 이용하여 depth가 5인 관계를 찾으면 된다.
먼저, 친구관계를 입력받아 양방향으로 연결된 그래프를 생성한다. 그리고 모든 노드에 대한 DFS 탐색을 수행한다. DFS 탐색은 백트래킹을 이용하여 방문했던 노드에서 연결된 노드가 있을 경우 방문 체크를 해준 뒤 DFS를 수행한다. DFS 수행 이후 방문한 노드의 상태를 방문하지 않은 것으로 다시 바꿔준다. 탐색 중 DFS의 depth가 5가 되는 경우, 5명의 친구가 연결되었다고 판단하고 check 변수를 true로 만들어 준다. check 변수에 따라 1 또는 0을 출력해준다.
코드
import java.util.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
val st = StringTokenizer(br.readLine())
val num = st.nextToken().toInt()
val case = st.nextToken().toInt()
val graph = List(num) { mutableListOf<Int>() }
repeat(case) {
with(StringTokenizer(br.readLine())) {
val start = nextToken().toInt()
val end = nextToken().toInt()
graph[start].add(end)
graph[end].add(start)
}
}
lateinit var visited : BooleanArray
var check = false
fun dfs(depth: Int, idx: Int) {
if(depth == 5 || check) { // 5명의 친구 연결
check = true
return
}
graph[idx].forEach {
if(!visited[it]) { // 백트래킹
visited[it] = true
dfs(depth + 1, it)
visited[it] = false
}
}
}
for(i in 0 until num) { // 모든 노드에 대해 DFS 수행
visited = BooleanArray(num)
visited[i] = true
dfs(1, i)
}
bw.write(if(check) "1" else "0")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1213번: 팰린드롬 만들기 - Kotlin[코틀린] (0) | 2023.12.18 |
---|---|
[백준] 1449번: 수리공 항승 - Kotlin[코틀린] (0) | 2023.12.17 |
[백준] 2669번: 직사각형 네개의 합집합의 면적 구하기 - Kotlin[코틀린] (0) | 2023.12.13 |
[백준] 1339번: 단어 수학 - Kotlin[코틀린] (0) | 2023.12.11 |
[백준] 2346번: 풍선 터트리기 - Kotlin[코틀린] (0) | 2023.12.11 |