毎日ちょっとでもコード書くようにしたいなーと思っていたので、AtCoderをやってみることにした。
で、入門に良さそうな問題集としてまずはこれを解いた。
問題はこちらの記事がベースになっているらしい。
A問題はさすがに簡単なのでスキップしたけど、残りは全部解いた。
このリポジトリで管理している。
進め方
- 問題を読む
- 自力で解く
- ACしたら解説読む
- 全然違う解き方だったら解説の解き方で書き直す
- ChatGPTに「よりRustらしい書き方にならないかレビューしてください」って言って返ってきたコードを読む
- ...を1日1問ぐらいのペースでやる
ChatGPTに聞くのは気休めだけど、コレクションの操作とかで知らない書き方を教えてくれることがたまにあった。
感想
全体の感想として、これからAtCoder始めるのにちょうどいい難しさだなーと思った。
RustでAtCoderに挑戦するときの入力の受け取り方とかテストとかに慣れるのに良かった。
一方、これらの問題に関してはまだ数学的なテクニック(◯◯法、と名のつくものとか)を学ぶきっかけになったり、計算量を気にするようなものはなかった。そこは若干物足りなさがあったので、こっからステップアップしていきたい。
以後、いくつかの問題について感想を。
ABC087B - Coins
いつものfor文ゴリ押し戦法だったけど正攻法だったぽい
ABC083B - Some Sums
各桁の合計出すのに一度文字列にしたけど、10で割った余りを足して10で割るを繰り返すのがよくあるやり方らしい
ABC088B - Card Game for Two
こんな感じで書けるよってのはChatGPTに教えてもらったはず。
let (a_sum, b_sum) = a .iter() .enumerate() .fold((0, 0), |(a_sum, b_sum), (index, &num)| { if index % 2 == 0 { (a_sum + num, b_sum) } else { (a_sum, b_sum + num) } });
ABC085C - Otoshidama
Qiita の解説に書いてある、このへんの計算量の肌感難しい。
ABC086C - Traveling
これが一番むずかしかった。 後ろから解く、なるほどなー。
次は何やる?
とりあえずB、C問題を片っ端からやってみるかーと思ってたところ、
AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ #AtCoder - Qiita
の「ここまで解いたら」というセクションで問題がいくつか紹介されていたので、とりあえず次はこれを解くことにした。
あと、競プロ系の本いくつか家にあるのでこういうの読み進めるのと並行させたい。