当記事ではAtCoder、ABCのB問題ならびにC問題(時々D問題も)のKotlinでの解法を超初心者向けに詳細に解説します。
B - Prefix?
やりたいこと
文字列Tが文字列Sで始まるかどうかを判定しよう。やり方は色々あるが、String
の startsWith
メソッドを使用するのが手軽だろう。
入力値の取得
// 入力値の取得
val s = readLine()!!
val t = readLine()!!
サンプルコード
main.kt
fun main(args: Array<String>) {
// 入力値の取得
val s = readLine()!!
val t = readLine()!!
// t が s で始まるかどうか
val isPrefix = t.startsWith(s)
println(if (isPrefix) "Yes" else "No")
}
C - Chinese Restaurant
やりたいこと
それぞれの料理を何回移動させれば満足できるのかを見ていこう。料理 $p^i$ は位置が以下3通りの場合に満足となる。
- $(p^i - 1)\ mod \ N$
- $p^i \ mod \ N$
- $(p^i + 1)\ mod \ N$
これらと現在位置 ( i )との差 ( m とする) を求めて、mをキーとするMutableMapに件数を計上しよう。最終的にマップの値のうち一番大きいものが答えとなる。
入力値の取得
// 入力値の取得
val n = readLine()!!.toInt()
val p = readLine()!!.split(" ").map { it.toInt() }
サンプルコード
main.kt
fun main(args: Array<String>) {
// 入力値の取得
val n = readLine()!!.toInt()
val p = readLine()!!.split(" ").map { it.toInt() }
val cnt = mutableMapOf<Int, Int>()
for (i in p.indices) {
// 料理を満足できる人のリスト
val targets = (-1..1).map { getNum(p[i] + it, n) }
targets.forEach {
// 料理を満足できる人のところまで動かす移動量を求める
val diff = getNum(it - i, n)
// 移動量をキーとしたMutableMapに件数を計上していく
cnt[diff] = (cnt[diff] ?: 0) + 1
}
}
println(cnt.values.max())
}
fun getNum(target: Int, n: Int): Int {
var ret = target
while (ret < 0) {
ret += n
}
return ret % n
}