[백준] 토너먼트 (1057)(kotlin)
문제 설명
입력 및 출력
» 입력
첫째 줄에 참가자의 수 N과 1 라운드에서 김지민의 번호와 임한수의 번호가 순서대로 주어진다. N은 100,000보다 작거나 같은 자연수이고, 김지민의 번호와 임한수의 번호는 N보다 작거나 같은 자연수이고, 서로 다르다.
» 출력
첫째 줄에 김지민과 임한수가 대결하는 라운드 번호를 출력한다. 만약 서로 대결하지 않을 때는 -1을 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
16 1 2 | 1 |
16 8 9 | 4 |
1000 20 31 | 4 |
65536 1000 35000 | 16 |
60000 101 891 | 10 |
9 9 7 | 4 |
23781 15127 15461 | 11 |
문제 풀이1
import kotlin.math.ln
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
var (N, jimin, hansoo) = readLine().split(" ").map { it.toInt() }
var max = ln(N.toDouble()) / ln(2.0)
var count = 1
while (count <= max + 1) {
if (N % 2 == 0) {
N /= 2
for (i in 1..N) {
if (jimin == i * 2 || jimin == i * 2 - 1) jimin = i
if (hansoo == i * 2 || hansoo == i * 2 - 1) hansoo = i
}
} else {
N = (N / 2) + 1
for (i in 1 until N) {
if (jimin == i * 2 || jimin == i * 2 - 1) jimin = i
if (hansoo == i * 2 || hansoo == i * 2 - 1) hansoo = i
}
if (jimin >= N) jimin = N
if (hansoo >= N) hansoo = N
}
if (jimin == hansoo) {
println(count)
return
}
// println(count)
// println("$N : $jimin $hansoo")
count++
}
println(-1)
}
문제 풀이2
fun main(args: Array<String>) = with(System.`in`.bufferedReader()) {
var (N, jimin, hansoo) = readLine().split(" ").map { it.toInt() }
var count = 0
while (jimin != hansoo) {
jimin = jimin / 2 + jimin % 2
hansoo = hansoo / 2 + hansoo % 2
count++
}
println(count)
}