どのように競うの?
ACM-ICPC国内インターネット予選では、6~7問程度の問題が出題され、3時間の競技時間でどれだけ多く、早く、正確に解けるかを3人1組のチームで競います。問題の読解力、解法の考案力、そしてプログラミング能力が勝敗のポイントになります。
問題が解けたかどうかは、審判団が用意した入力データのすべてに対して、皆さんのプログラムが、正しい出力をできるかどうかによって判定されます。つまり、審判団がユニットテストをするわけです。この判定は、競技時間中にリアルタイムで行われ、競技者はプログラムが正解か不正解かのみを知らされます。もし不正解でも、競技時間内なら再度チャレンジすることはできますが、「お手つき」としてペナルティタイムが加算されてしまいます。最終的に多くの問題を早く解くためには、あわてないことも大事です。
問題の難易度は様々です。たとえば、単に平均などが計算できれば良いという問題もあります。難しいものには、複数のアルゴリズムを組み合わせて解く問題もしばしば出題されます。
ACM-ICPCの特徴は、チームで戦うことにあります。チームには、1台のコンピュータしか与えられません。つまり、個人のプログラミング能力だけではなく、1台のコンピュータをいかに効率的に活用するかというチームワークの良さも勝負の鍵になります。
コンテストに参加するには?
参加するのは簡単です。参加費は無料で申し込みもインターネットで簡単に行えます。同じ大学の3人の学生でチームを結成して、まず日本での国内インターネット予選に参加しましょう。
国内インターネット予選を勝ち抜いたチームは、アジア地区大会に出場できます。
アジア地区大会の出場チーム選出では、全体順位だけでなく、同一大学内での順位も考慮されます。ACM-ICPCは名前の通り大学対抗のコンテストなので、なるべく多くの大学にチャンスを与える考えがあるためです。
日本で行われるアジア地区大会では、国内インターネット予選を勝ち抜いた30-40程度のチームと外国からの招待チームが参加して、10問程度の問題を5時間で解答します。アジア地区大会は国際大会ですので、問題の記述や大会の運営はすべて英語で行われます。競技の緊張感はもちろん、レセプションでのおいしい食事や、他大学チームと交流も含めて、大学生活の大切な思い出として残るでしょう。アジア地区大会の上位1-2チームは、世界の強者が集まる世界大会への道が開かれます。世界の地区大会を勝ち抜いた強豪チームと世界一の座を争うことは、かけがえのない経験になるでしょう。日本からも例年複数の大学を送り出しています。
効果的に練習するには?
まずは過去の問題を解いてみましょう(→どんな問題を解くの?)。
一番易しい問題は、if文とfor文の簡単な組み合わせで解けることが多いので、初めての人もぜひ挑戦してみてください。一方で、一部の難しい問題を解くためには、総合的な能力が求められます。アルゴリズムやデータ構造の知識や、複雑なプログラムをバグなく組み上げる力、問題を手持ちの道具で解決できる形に分解する力などを磨きましょう。上位入賞を目標とするチームの場合は、プログラミングが得意な人が集まっている場合でも、専門書を読んだり本番を想定した環境で問題を実際に解いたり、チームの役割分担を工夫したりして、本番で実力を発揮できるよう練習しましょう。
良いチームワークを形成するには?
プログラミングの勉強と並行して、チームワークも高めてゆきましょう。一人がコンピュータを使っている間に、他のチームメイトがどのような役割を分担するかが大事になります。適切な戦略は、チームにより幅があります。1人1人が完全に違う問題を考えることもできますが、2人でペアプログラミングをしながらもう1人が別の問題の解法を考えるという戦略も有力です。
最初からチームワークが上手く機能するチームはまずありません。しかし、練習を進めるに従って、3人の個性のようなものが見えてくると思います。たとえば、動的計画法や幾何などの問題のジャンルに関する得意不得意を反映させたり、問題の解釈や解法の検討・プログラムの実装方法について議論し、確認し、お互いのミスを補いながら競技をすすめる、このようなチームワークが競技の大きな鍵となります。チーム練習を重ねて培う連帯感、これは他の大学生活ではなかなか得られないことです。
最後に
ACM-ICPCを通して、プログラミングの練習をし、腕を競い、友達ができ、さらに腕を競い合う、その中で皆さんがプログラミングの真の楽しさを感じ取ってくれることを心から願っています。その輪の中から、いずれ必ず世界チャンピオンが出てきてくれると信じています。
参考資料
- 大学対抗プログラミングコンテスト「ICPC」への挑戦–目指せ!プログラミング世界一– 筧 捷彦 近代科学社
- 未来のコンピュータ好きを育てる: 3.国際大学対抗プログラミングコンテスト 情報処理 50(10) 山口 文彦, 山口(繁富)利恵
- Observations on teamwork strategies in the ACM international collegiate programming contest, Saman Amirpour Amraii, ACM Crossroads, 2007