LoginSignup
2
0

More than 3 years have passed since last update.

KotlinでAtCoder135の問題Cを解いてみた

Posted at

はじめに

毎週木曜日に知人とモブプロをやってるのですが、
そこで始めてAtCoderの過去問を解く経験をしました。
そのときはAtCoder135の問題をJavaScriptで解いたのですが、
問題Cだけ最後まで解けなかったので、自宅でKotlinで解いてみました。

対象の問題はこちら

ちなみにKotlinは勉強中くらいのレベルで、
業務で使ったことはおろか、なにかアプリを開発したこともありません。

なお、本記事では回答として提出した内容が表示されるので、
もしネタバレを気にする方はお気をつけください。

KotlinでAtcoder135の「C - City Savers」

2019年8月4日現在では、Version1.0までしか対応していません。
今回は特に困りませんでしたが、コルーチンなどは使えないのでそこは要注意かと思います。

実際に提出した回答は以下の通りです。

Main.kt
fun main(args: Array<String>) {
    val n:String? = readLine()
    val monstersInput:String? = readLine()
    val saversInput:String? = readLine()

    if (n == null || monstersInput == null || saversInput == null) return

    val monsters:List<String> = monstersInput.trim().split(" ")
    val savers:List<String> = saversInput.trim().split(" ")

    var count:Long = 0
    var nextAttack:Long = 0
    for (i in savers.indices) {
        var monster = monsters[i].toLong()
        val saver = savers[i].toLong()
        if (nextAttack > 0) {
            if (monster < nextAttack) {
                count += monster
                monster = 0
            } else {
                count += nextAttack
                monster -= nextAttack
            }
        }

        if (monster < saver) {
            count += monster
            nextAttack = saver - monster
        } else {
            count += saver
            nextAttack = 0
        }
    }

    if (nextAttack > 0) {
        val lastMonster = monsters.last().toLong()
        count += if (lastMonster < nextAttack) lastMonster else nextAttack
    }

    println(count)

}

ハマったポイント

未使用変数

提出当初、変数nは使用しておらず、
未使用変数の警告が発生していました。

これが原因でAtCoder側でエラーになっており、
とりあえずnullチェックいれて回避しました。

パッケージは不要だった

最初 package citysavers を付けていたのですが、
これが原因で提出後にエラーになっていました。

提出した際のエラーメッセージがわからないため、原因が分からず非常に悩みました。
他の人の回答を見て気づけたので、他の回答を参考にできるのはありがたい仕組みです。

感想

他の人の問題はちらっと見た感じですが、
知らないメソッドや構文を使われている方が居たので、参考にしたいと思います。
具体的には for文でのuntil、入力データの取得に用いているrepeat あたりは知らなかったので、
復習しておきたいと思います。

AtCorder自体、実行速度やメモリを競うプログラミングコンテストだと思っていたため、
自分にはまったく関係ないと思っていました。
ですが、単純に回答完了までの早さを競うのであれば、
業務に置き換えても早く実装が完了するに越したことはないので、良い鍛錬になるなぁと思いました。

また、同じ問題について他人の解答を見れるのが、
一人で勉強しているエンジニアには非常にありがたいことです。
特に自分にとって新しい言語を勉強しているが、
まわりに聞ける人が居ない環境にいる人には大変よい仕組みだなぁと思います。

おわりに

始めてAtCorderをやってみて、
Kotlinでやる際の注意点、やってみた感想をアウトプットしてみました。

慣れてないので難しいのと、これまでがそんなにコーディングに関して勉強していない(求められない)環境だったので、
難易度は高めに感じました。

個人的に新しい言語を学ぶ際に非常に有意義に感じたので、
Kotlinで過去問を一通り解いてみようと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0