ことさら−古都プログラマーの更級日記

京都でお寺を回りながら御朱印集めをしていたり、LoLをしたり試合を見に行ったりしているエンジニアのブログです。技術的なはなしとか日常的なはなし、カメラやLoLや競馬の話も書きます。右メニューに検索やらカテゴリーやらがあるので、見たい記事だけ見てね!

プログラミングコンテストとかアルゴリズムとかを学びたい人向けの本3選

僕の古いブログの記事を引用していた以下の記事を見たら、こういうことが書いてあった。

任意の整数を扱う問題が出たら基本的にDP使うんか?

syuntoku14.hatenablog.com

確かにDP(動的計画法: Dymanic Programming)をどのような問題に対して使えばいいかは難しい。

この方はアルゴリズムというよりかは、Pythonの練習をしているようだったが、「アルゴリズムの勉強したいが何していいかよーわからん」という人もいるだろうなーと思った。そこで、僕が読んだことあるアルゴリズムプログラミングコンテストに関する以下の本の簡単な内容と難易度を紹介する。

プログラミングコンテストチャレンジブック

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテストチャレンジブック [第2版] ?問題解決のアルゴリズム活用力とコーディングテクニックを鍛える?

プログラミングコンテスト」と聞いて一番有名な本がこれだろう。表紙が蟻の柄なので「蟻本」と呼ばれていたりする。特徴としては

どちらかというと、本気でプログラミングコンテストで勝ちたい人向けの本で難易度は高めである。アルゴリズムにあまり触れたことがない人は、後述の「最強最速アルゴリズマー養成講座」のほうをオススメする。

最強最速アルゴリズマー養成講座

高橋直大さんという、AtCoder社の社長さんが書かれた本である。表紙がヒョウ柄(チーター柄?)なので「チーター本」などと呼ばれている。

難易度が易しいので、初心者にはまずこの本をオススメしたいのだが、練習問題にtopcoderというところの問題を使っているのが(個人的には)ちょっとマイナス。AOJ(Aizu Online Judge: http://judge.u-aizu.ac.jp/onlinejudge/)に比べるとtopcoderはちょっと使いづらい印象があるので、個人的にはAOJの方が好きだ。*1

注意点としては、難易度はそこまで高くないので、本気で勉強したい人はこちらより「プログラミングコンテストチャレンジブック」をオススメする。

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

これら3冊の本の中では一番新しい本で、AOJ(Aizu Online Judge: http://judge.u-aizu.ac.jp/onlinejudge/)にも関わっている会津大学の渡辺先生が執筆した本である。秋葉さん(プログラミングコンテストチャレンジブックの著者)も参加している。

  • Aizu Online Judge の問題と対応しているため実践しやすい
  • サンプルコードはCまたはC++
  • 難易度もそこまで高くない。

なんといっても、AOJを使う前提の本なので、本を読んでAOJで実践できるし、AOJの使い方が乗っているのもありがたい。新しい本なだけあって、図も多く内容も分かりやすい。「最強最速アルゴリズマー養成講座」だとどうしてもtopcoderのUIなどに慣れるところから始まってしまうが、こちらはそういう面倒臭さもない。難易度も平易なので、ガチの人向けの本ではないが、アルゴリズムを学びたい人にはぴったりだろう。サンプルコードがCまたはC++しかない点だけがちょっとデメリットか。

まとめ

アルゴリズムの勉強を実践的に(実際にコードを書きながら)したいなら、この3冊のどれかになると思う。

かなと思う。一番のオススメは「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」である。是非参考にして欲しい。

番外編

番外編で「世界で闘うプログラミング力を鍛える150問」というのも読んだことあるがあまり内容を覚えていないので紹介だけにしておく。この本はサンプルコードとかは豊富ではないので、やはり上記3冊の方が僕は好きかな。

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

世界で闘うプログラミング力を鍛える150問 ~トップIT企業のプログラマになるための本~

*1:ちなみに、この本はなにかの連載をそのまま本に落としただけなので、高橋直大先生は「書籍用に書き直して第二版を書きたい」という願望があるらしい。ただ、彼は凄く忙しいのでしばらく第二版は出ないきがしている