문제
20040번: 사이클 게임
사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터 n − 1 까지 고유한
www.acmicpc.net
풀이
유니온 파인드(Union-Find)를 활용해 풀이하면 된다. 반복문을 통해 입력받은 선분을 합집한(Union) 연산하고 사이클이 발생한 경우에 해당 번호를 출력한다.
코드
import java.util.*
fun main() {
val br = System.`in`.bufferedReader()
val bw = System.out.bufferedWriter()
var st = StringTokenizer(br.readLine())
val num = st.nextToken().toInt()
val case = st.nextToken().toInt()
val parent = IntArray(num) { it }
var cnt = 0 // 사이클이 없는 경우 0을 출력한다
var check = false // 사이클 발생 여부
fun find(a: Int): Int {
return if(parent[a]==a) a
else {
parent[a] = find(parent[a])
parent[a]
}
}
fun union(a: Int, b: Int, idx: Int) {
val x = find(a)
val y = find(b)
if(x==y) { // 사이클 발생
cnt = idx
check = true
} else if(x < y) {
parent[y] = x
} else {
parent[x] = y
}
}
repeat(case) {
st = StringTokenizer(br.readLine())
if(!check) {
union(st.nextToken().toInt(), st.nextToken().toInt(), it + 1)
}
}
bw.write("$cnt")
bw.flush()
bw.close()
br.close()
}
'알고리즘 > Baekjoon' 카테고리의 다른 글
[백준] 1197번: 최소 스패닝 트리 - Kotlin[코틀린] (0) | 2023.11.09 |
---|---|
[백준] 9372번: 상근이의 여행 - Kotlin[코틀린] (0) | 2023.11.08 |
[백준] 4195번: 친구 네트워크 - Kotlin[코틀린] (0) | 2023.11.06 |
[백준] 1976번: 여행 가자 - Kotlin[코틀린] (1) | 2023.11.03 |
[백준] 1922번: 네트워크 연결 - Kotlin[코틀린] (0) | 2023.11.01 |