[백준] 토너먼트 (1057)(kotlin)

문제 설명

백준 1057번 문제 링크

입력 및 출력

» 입력

첫째 줄에 참가자의 수 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)
}