細かすぎて伝わりにくいTopCoderのコーディングスキル向上マジック最強最速アルゴリズマー養成講座(1/3 ページ)

競技プログラミングはレベルの高い人たちの集まり――そんな考えを持っている初心者の方、TopCoderはあなたのコーディングスキルを爆発的に高める魔法のような場です。今回は、初心者にこそお勧めしたいTopCoderの魅力について考えます。

» 2009年12月05日 00時00分 公開
[高橋直大,ITmedia]

教育的な観点から見るTopCoder

 今回からTopCoderに関する実践的アルゴリズムを解説していく予定でしたが、序盤のうちに触れておきたいことがありましたので、今回の枕は“教育的視点から見るTopCoder”というテーマで少し書こうかと思います。

 まず、最初に宣言しておきたいことは、この連載は初心者向きである、ということです。「どう考えても上級者向けだろう」という意見はたくさんの方から寄せられていますが、筆者は、まだプログラミングレベルが初心者の方、さらにいえば今日からプログラミングを始めようかと思っている方にTopCoderのような競技プログラミングに参加してもらいたいと考えています。

 筆者の個人的な見解を述べると、高専・大学の情報系学科のカリキュラムにTopCoderなどの競技プログラミングシステムを利用したものを導入すべきだ、とまで考えています。以下では、なぜプログラミングの初心者にTopCoderのような競技プログラミングが有効なのかを説明します。

初心者プログラマーに最適なTopCoder

 プログラミングは手段であり、目的ではありません。しかし、プログラミングを習得していく過程では、ある程度のレベルに達すると、何をすればよいのか分からなくなる方も少なからず存在します。また、何が楽しいのか分からない、何かが作れるビジョンが見えてこない、という理由で、せっかくはじめたプログラミングから足が遠のいてしまう方もおられると思います。

 一例を挙げると、どの言語を学ぶに当たっても、“Hello World!”と出力するプログラムは比較的初期の段階で学ぶと思います。しかし、これ自体を楽しいと思う方はどのくらいいるでしょう? 少なくとも、筆者にはあまり楽しいと思えませんでした。どうせプログラムを組むのであれば、何か役に立つもの、面白いものを作りたいと皆さんお思いでしょうが、初心者にとってそれは少し酷な話です。このように言語を習得する過程では、その初期段階でモチベーションが維持できないとうまく行かないのではないかと思います。

 ここで、単純に「練習でプログラムを組む」のに対して、「競技」というフレーバーを与えたらどうなるでしょうか? 「“Hello World!”は出力できたけど、ほかの人より3分も遅かった! 悔しい!」といったように、競技にすることで突然楽しみが生まれます。もちろん向き不向きも当然あるかと思いますし、競い合うことが嫌いな人にまで強要するものではありません。ですが、競争をすることは自分の実力を高めるのにふさわしく、さらに最も楽しめる方法である、とも筆者は考えます。

 そこで筆者が提案する最良の方法が、“TopCoderなどの競技プログラミングコンテストへの参加”なのです。この意見に「競技プログラミングはレベルの高い人たちの集まりで、自分なんかが出て大丈夫だろうか」と反論することはもちろん可能です。しかし、実際のところ、競技プログラミングへ参加するための必要条件は、

  • for文、if文が分かる
  • 配列が扱える
  • 文字列が扱える
  • 関数がどういうものか分かっている

程度であると筆者は考えます。事実、筆者が競技プログラミングを始めた当初は、文字列が扱えすらしませんでした。もちろん、これだけの知識では解けない問題も当然存在します。しかし一方で、プログラミングの知識として必要となるものの8割は満たしているのではないか、とも思います。

 つまり、TopCoderに参加することは誰にでもできることで、初心者だから、という理由で尻込みする必要はまったくないのです。まだ勉強中だから、勉強してから、と考える人が非常に多いのですが、TopCoderに参加すること自体が勉強となり、しかも大会形式なので非常に楽しめるのではないか、と思います。

 この連載で取り上げている問題は上級者でも苦戦するようなものを意図的に選んでいますので、問題が解けないといって残念に思う必要はありません。競技プログラミングの感覚をつかむとどのような思考ができるようになるかを具体的に示すことで、面白そうな世界だと感じていただければと思いますし、実際に知っている知識で書くことが可能なコードを提示して、それを参考にしてもらうことで、十分到達可能なレベルであることを目的としています。

TopCoderが実力向上に適している理由

 さて、ここまでは主に初心者が参加するメリットについて述べましたが、それ以外の人が参加するメリットも当然存在します。以下では、TopCoderが実力向上に適している理由を幾つか挙げてみましょう。

  • レーティングによる実力証明・確認

 TopCoderにはレーティングが存在し、出場するたびに、その結果でレーティングが上下します。これにより、自分の実力がどの程度であるかを自らが確認でき、また、それを他人に証明することもできます。

 通常の大規模な大会だと、実力がある程度の水準に達していない場合は1次予選で落ちてしまう、などということも珍しくなく、あまり楽しめないかと思います。しかし、TopCoderの場合は実力によってDivision1、2の2つに分かれており、その中で完全に順位がつくため、まったくの初心者でも正確な実力を把握できますし、レーティングを高めることに喜びを見出すのも容易でしょう。

  • 実行時間や使用メモリを意識できるようになる

 これは、連載第3回で書いた通りなので細かい話はしませんが、プログラムを書く際に絶対に身に着けておくべき感覚でありながら、それをまるで意識できていない人は非常に多いように思います。マシンパワーに頼ってもある程度どうにかなる時代ではありますが、そういった時代だからこそ見失いがちなこの感覚をきちんと持っていることは非常に大切です。

  • 別の参加者のソースの閲覧から学べる

 TopCoderに参加すると、上位陣が驚異的な早さでコードを提出することに驚かれるかもしれません。競技中に一発で書いたとは思えない短くまとめられた美しいソースコードそのものにもヒントが隠されています。これを活用しない手はありません。

 問題が解けなかった際は、こうしたソースコードを閲覧することで、解法を知ることができるのはいうまでもありませんが、問題が解けた場合でも、競技後に上位陣のソースコードを閲覧することは非常に有意義です。中には、自分が知らない知識に基づいたソースコードもあることでしょう。それを自分のものにすることで、実力を養うのは初心者でも上級者でもさほど変わりはありません。

  • Challenge Phaseによるバグの発見

 上の話とかぶりますが、TopCoderでは75分のCoding Phaseの後に、15分のChallenge Phaseが存在し、その時間で別の参加者のプログラムのバグを見つけると点数がもらえる、という制度が存在します(『あなたの論理的思考とコーディング力は3倍高められる』を参照ください)。その際に、他人のコードをよく見ることで、コードのよいところだけでなく悪いところが見えてきます。

 ここで筆者が取り上げておきたいのは、こうした場を経験することで、バグが発生しそうな個所が予測できる能力がつく、ということです。時間が限られていますのでコードをしっかりと読む時間はなく、読み飛ばしながらバグを見つける必要があります。そのため、ある程度的を絞って読まなければ、時間内にバグを見つけることができません。現実でもバグに遭遇する機会は多く、非常に大切な要素だといえるでしょう。

  • 競技プログラミングそのものが、汎用的なプログラミング能力を高める

 TopCoderに出ていても、TopCoderができるようにしかならない、という意見はよく耳にします。実際、競技プログラミング“だけ”しかやっていなければ、ゲームやアプリケーションを作ることは不可能でしょう。しかし、そもそもTopCoderに必要なのは早く正確にコードを書くことであり、ほかの場面においてそれが必要でないはずがないでしょうから、競技プログラミングが汎用的なプログラミング能力を高めるといっても差し支えはないでしょう。

 これへの反論として、競技プログラミング特有の悪い癖がついてしまう、という一見もっともらしい意見が存在します。例えば、「時間のプレッシャーによってきれいなコードを書けなくなってしまう」といったものです。こうした反論に対しては、実際に上位陣のコードを見てもらい、判断してもらうしかないと筆者は考えています。例えばRedcoderと呼ばれる人たちのコードを、あくまでも内容を理解した上で汚いコードだと思うのであれば、確かにそういった問題点があるといえるのかもしれません。しかし、そう思う人は非常に少ないだろう、と筆者は確信しています。早く正確に書こうとしていくことで、自然ときれいなコードが書けるようになっていくのでしょう。


 これらの理由から、プログラムに少しでも携わるほとんどの人にとって、TopCoderに参加することは有益であると筆者は考えます。ただ、長々と利点を書き連ねましたが、筆者がTopCoderに参加している最大の理由を挙げよといわれると、やはり楽しいからと答えます。何事も面白いと思って参加しなければ面白くなるはずがありません。

 この連載を読んで、少しでも面白そう、と感じたら、ぜひこの連載の問題を解いてみたり、TopCoderに実際に参加してみてください。Division1にてお待ちしています。

 それでは次のページから今回の問題です。今回は少し難易度を落とした問題をご用意していますので、ぜひ挑戦してみてください。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ