KMM (Kotlin Multiplatform Mobile) の導入のために,まず Kotlin に入門してみる。

AtCoder Beginner Contest 063 を解く。

開発環境

Gradle: org.jetbrains.kotlin:kotlin-stdlib:1.5.10

A - Restricted

  • 複数空白区切り入力(Int)
    • readLine の戻り値は nullable (SwiftのOptional型に似てる概念?) なので non-null にする

 

fun main() {
    val (a, b) = readLine()!!.split(" ").map{it.toInt()}
    val answer = a + b

    if (answer >= 10) {
        println("error")
    } else {
        println(answer)
    }
}

B - Varied

  • 単一入力(String)
  • 重複検出

 

fun main() {
    val s = readLine()!!
    val sortedSet = s.toSortedSet()

    if (s.length == sortedSet.size) {
        println("yes")
    } else {
        println("no")
    }
}

C - Bugged

  • 複数行入力(int)
  • 剰余
  • 関数  

 

fun canDivide(num: Int, by: Int): Boolean {
    return num % by == 0
}

fun main() {
    val n = readLine()!!.toInt()
    val nums = (0 until n).map { readLine()!!.toInt() }.sorted()
    
    val sum = nums.sum()

    if (!canDivide(sum, 10)) {
        println(sum)
        return
    }

    nums.forEach{ num ->
        val remained = sum - num
        if (!canDivide(remained, 10)) {
            println(remained)
            return
        }
    }

    println(0)
}

D - Widespread

  • 関数

 

fun canBeatAll(num: Long, a: Long, b: Long, H: List<Long>): Boolean {
    var total: Long = 0
    H.forEach { h ->
        if (h - b * num > 0) {
            total += (h - b * num + a - b - 1) / (a - b)
        }
    }
    return total > num
}

fun main() {
    val (n, a, b) = readLine()!!.split(" ").map{it.toLong()}
    val H = (0 until n).map { readLine()!!.toLong() }

    var ng: Long = 0
    var ok: Long = 1000000010
    while (ok - ng > 1) {
        val mid = (ng + ok) / 2

        if (canBeatAll(mid, a, b, H)) {
            ng = mid
        } else {
            ok = mid
        }
    }

    println(ok)
}

感想

  • 組み込み関数が強力(toSortedSet
  • nullale 関係の仕組みがあって良い (色々なとこでゼロ値だけではキツいところがある)
  • var, val 分かりにくい
  • Swift に慣れたからか、if文の条件式の括弧書くのが手間

参考