納得!朝三暮四

色々書きます

プログラミングの基礎文法力を上げると良い

だいたい競技プログラミングにおいてレートを上げるのに効くのは、使える道具を増やすか速解き力をつけることである。

速解き力について人はなんとなく苦手意識を持ちがちだが、これはだいたい「焦って解きたくない」という誤解に基づく(私もそうだった)。しかし実際、速解き力とは焦らずにプログラムを書く能力であると思う。したがって、使える道具の数によらず、常に速解き力は鍛えることができ、次に使えるようになるべき道具が手に余るようであれば速解き力に目を向けたほうが良い。ある程度速解き力がつくと次の道具を身につける余裕も出てくる。

速解き力についての苦手意識その2が、これが「慣れ」によって得られるものであるから、というヤツである。確かに「慣れ」は重要であるのだが、そもそもどうやれば速く解けるのか、ということを理解していないのに「慣れ」が生じることはなく、ここにあまり伸びる余地はない。タイピング力を鍛えるのもそこまで重要ではない。

で、手っ取り早く速解き力を上げる方法がプログラミングの基礎文法力を上げることである。だいたい基礎文法力がないプログラムは、無駄に長い。試しに自分の昔の提出なりレートの低い他人の提出を見てみると、無駄なことを書いてあることがわかると思う。今まで書いていた「プログラムの書き方」を短くするだけなので高度な数学能力は必要なく、「なんとなく」で済ませていた文法に目を向けるだけである。

コンテスト後は解説を読み、提出したプログラムの書き直しをするとよい。理解していたとしても本番で実践できているとは限らず、見直すことで無駄が見つかることも多い。

以下、C++を使う上で自分が意識できていること。

  • インデントを正しくする
  • 参照を理解する
  • autoを使う
  • 三項演算子を理解する
  • 範囲ベースforを使う
  • for文の構造を理解する。whileではなくforで書けないか?
  • 変数宣言はまとめる
  • 必要に応じて変数を使い、必要以上に変数を使わない
  • 2回以上同じ処理をする場合、関数化するか意識する。参照で済ませられることもある
  • 解ける問題に対し、「とりあえず変数を受け取る」をしない。特にvectorで受け取る必要があるか、逐次的に捨てて(受け取ったそばから処理して)問題ないか意識する
  • vectorはだいたいstringでどうにかなる