当記事ではAtCoder、ABCのB問題ならびにC問題(時々D問題も)のKotlinでの解法を超初心者向けに詳細に解説します。
B - Rectangle Detection
やりたいこと
入力された文字列のリストの内、'#'で構成される長方形のエリアの上辺、下辺、左辺、右辺を求めよう。
List.indexOfFirst
と List.indexOfLast
で上辺と下辺を求めよう。
そして'#'を含む行(文字列)に対して、String.indexOf
と String.lastIndexOf
で左辺と右辺を求めることができる。
これらで得た値は0始まりのインデックス値なので、答えとして出力する場合は1を加えよう。
入力値の取得
// 入力値の取得
val s = (1..10).map { readLine()!! }
サンプルコード
main.kt
fun main(args: Array<String>) {
// 入力値の取得
val s = (1..10).map { readLine()!! }
// 上辺を求める
val a = s.indexOfFirst { it.contains('#') } + 1
// 下辺を求める
val b = s.indexOfLast { it.contains('#') } + 1
// 左辺を求める
val c = s[a - 1].indexOf('#') + 1
// 右辺を求める
val d = s[a - 1].lastIndexOf('#') + 1
// 答えの出力
println("$a $b")
println("$c $d")
}
C - Submask
やりたいこと
入力値を2進数表記にし各桁ごとに処理を行う。
該当桁が
0の場合、xの同じ桁は0
1の場合、xの同じ桁は1または0
1の数は最大15という制約があるため、全ての組み合わせは最大32768通りとなる。
各桁の処理をメソッド化し、全ての組み合わせを網羅するよう再帰処理を行おう。
処理の順番を上位の桁→回の桁、かつxの桁が0になる場合→1になる場合の順で処理を行うことにより、ソート不要となる。
入力値の取得
// 入力値の取得
n = readLine()!!.toLong()
サンプルコード
main.kt
fun main(args: Array<String>) {
// 入力値の取得
n = readLine()!!.toLong()
getAns(0, 63)
}
var n = 0L
// 各桁に対する処理
fun getAns(subTotal: Long, index: Int) {
if (index < 0) {
// 最後の桁まで処理し終えたので、数字を出力
println(subTotal)
return
}
// 該当の桁が0の場合
getAns(subTotal, index - 1)
val num = 1L shl index
if (n and num != 0L) {
// nの該当の桁が1の場合の処理
getAns(subTotal + num, index - 1)
}
}