AtCoder に登録したら解くべき精選過去問 10 問を Ruby で解いてリファクタリングする

zコーディング力向上を目標にAtCoderの問題を解いていきます。
回答が掲載されていてかつ日本語で学習できるのでかなり効率よく学習できそうです。

今回は、AtCoder初心者オススメの10問を自力で回答し、他の方の回答を見てベストプラクティスを考察し、リファクタリングしていきます。

過去問精選問題記事:AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~

リファクタリング参考記事:AtCoder に登録したら解くべき精選過去問 10 問を Ruby で解いてみた

第 0 問: A – Welcome to AtCoder

  • 自分の回答
  • 模範回答
  • ポイント
    • 1行で複数の値を変数に代入するにはmapメソッドで配列に代入するより、一括代入を利用する
    • 文字列の結合は変数展開が良い
    • 後置ifでif文をシンプルに
  • 参考

第 1 問: ABC 086 A – Product 

  • 自分の答え
  • 模範回答
  • ポイント
    • if分は3項演算子でシンプルに書く

第 2 問: ABC 081 A – Placing Marbles 

  • 自分の答え
  • 模範回答
  • ポイント
    • sumメソッドはRubyのバージョン2.4から利用できるが、AtCoderのRubyのバージョンは2.3なので利用できない
    • sumメソッドの代わりにinjectメソッドを利用する
  • 参考

第 3 問: ABC 081 B – Shift Only 

  • 自分の回答
    • 回答できず
  • 模範回答
    • ポイント
      • all? (Enumerable)メソッドで配列の中身の真偽値を判定できる
    • 参考

    第 4 問: ABC 087 B – Coins

    • 自分の回答
      • 回答できず
    • 模範回答
    • ポイント
      • 同形式の複数の標準入力をtimesメソッドを利用して受け取る
      • 複数の変数の組み合わせはeachメソッドを利用して入れ子の繰り返しを行う
    • 参考

    第 5 問: ABC 083 B – Some Sums

    • 自分の回答
    • 模範回答
    • ポイント
      • 自分の回答もなかなかシンプルでよかった
      • 各桁の合計の求め方は、数字を文字列として分割する方法をとったが、算数的に10で割って余りの合計を足していく方法の方が主流なよう
      • 合計値を求める変数は配列としてではなく、変数として扱った方が出力がシンプルになる

    第 6 問: ABC 088 B – Card Game for Two

    • 自分の回答
    • 模範回答

    第 7 問: ABC 085 B – Kagami Mochi 

    • 自分の回答
    • 模範回答

    第 8 問: ABC 085 C – Otoshidama 

    • 自分の回答(タイムオーバー)
    • 模範回答
    • ポイント
      • 1000円の枚数である変数[l]は他の変数からの差し引きで求められる。繰り返しで用いることで、処理時間がx倍になってしまうので注意

    第 9 問: ABC 049 C – Daydream

    • 自分の回答(不正解)
    • 模範回答
    • ポイント
      • 文字列の比較なので正規表現を利用している
        • * 0回以上の繰り返し
        • + 1回以上の繰り返し
        • ^ 行頭にマッチ
        • $ 行末にマッチ
        • \A 文字列の先頭にマッチ
        • \Z 文字列の末尾にマッチ
    • 参照

    第 10 問: ABC 086 C – Traveling 

    • 自分の回答
    • 模範回答
    • ポイント
      • ブロックの繰り返しは必ずしも変数(|s|など)を用意する必要はない
      • ループ全てでtrueの場合と一度でもfalseになった場合の判定は初期値を用意しておき、falseになった場合初期値を変更する
      • 計算量を減らすためfalseになった時点でbreak(exit)を利用する
      • 変数は始点(x1, y1)と移動点(x2, y2)、距離(distance)をわかりやすく命名する
    • 参考

    まとめ

    AtCoderは出題形式が日本語であり、かつ他の方の提出回答一覧も見ることができ、コーディングの学習効率がとても高いなと感じました。

    また、BeginnersSelectionは問題が練られていて、とても勉強になり、徐々にスキルアップしている実感が得られこの点も良かったですね。

    初心者向けの大会、AtCoderBeginnersContestにも出場してみようという気持ちになりました!!

      コメントを残す

      メールアドレスが公開されることはありません。 * が付いている欄は必須項目です