AtCoder:8 ABC085B – Kagami Mochi

25/12/2020

https://atcoder.jp/contests/abs/tasks/abc085_b
問題文は上記リンクを参照。

指定したサイズのIntArrayを作成し、Int型を返す初期化処理を指定します。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int-array/

val list = IntArray(n) { readLine()!!.toInt() }

これで標準入力から与えられる数値をn件読み込みます。

Javaでは大きい順に並び替え、ひとつづつ大きさを比較し上に積み上げることができるか(lastSizeがinput[i]の値より大きいか)を確認していました。
ですが、よくよく考えるとこの処理は重複した値を排除している処理であることがわかります。
言い換えると、この問題は積み上げられる件数だけを確認すればよく、順序は問われていません。

つまり重複した値を取り除けば、全ての値は(順序はわかりませんが)どこかに積み上げられることがわかります。

例えば、ListやMap、Array(配列)は重複した値を保持しますが、Setは重複した値は保持しませんのでSetに変換し、その件数を数える方法が考えられます。

ですがそこまでしなくても、KotlinのListには重複を排するdistinctメソッドがあります。

list.distinct().count()

このメソッドを使い重複を排除した件数を数えればよいことがわかります。

参考

Kotlinのコレクションクラスの各メソッドをまとめて紹介している情報がありましたので参考までに。
Kotlin のコレクション使い方メモ
https://qiita.com/opengl-8080/items/36351dca891b6d9c9687

IntArrayとArray<Int>の違いについて分かりやすく説明してある情報がありましたので参考までに。
Kotlin: IntArray と Array<Int> の違い
https://qiita.com/KenjiOtsuka/items/e3d42f34ee731747220d

Advertisements