こんにちは、ハルキです。
今回は、競技プログラミングとなんなのか、分かりやすく説明していきます。
あわせて、過去問や参加方法についても解説していきます。
競技プログラミングに興味のある方は、よかったら読んでみてくださいね。
目次
競技プログラミングとは?
競技プログラミングとは、プログラミングスキルを競うコンテストのことです。
問題を解決するためのプログラムコードを、いかに素早く、正確に記述できるかを競います。
競技ジャンルも幅広く、アルゴリズムやセキュリティ、AI、ゲーム、データマイニングなど複数のジャンルがあります。
このなかでもっとも主流なのはアリゴリズムです。
実務のプログラミングとの違い
実務のプログラミングでは、顧客の要望から、作成した仕様書・デザインに従ってプログラミングを行い、正確なシステムを構築するスキルが必要です。
対して、競技プログラミングは、制限時間内に与えられた問題を解決するプログラムを記述します。
そのため、競技プログラミングは、実務のプログラミングに比べ、コードを打つ速度・発想力がとても重要になるのです。
競技プログラミングに取り組めば、プログラミングのスキルだけでなく、アルゴリズムへの理解も深まります。
これらは、実務でのプログラミングにも活用することができるでしょう。
競技プログラミングのメリット
以下が競技プログラミングをするメリットです。
・プログラミングが楽しく学べる
・就活などでアピールできる
プログラミングスキルの向上
競技プログラミングは、「問題を解く⇒動作を確認する⇒答えと見比べる」の繰り返しです。
この作業を、何度も繰り返し行うことで、効率よくプログラミングスキルが身に付くでしょう。
有名な競技プログラミングサイト「AtCoder」では、ただ答えを確認できるだけでなく、プログラムの実行速度やコードの長さなどもチェックできます。
コードをよりシンプルにするためにはどうすればいいのかを考えることもできるので、コードの精度も高められます。
プログラミングがたのしく学べる
競技プログラミングは、順位やレーティングなどで、自分の実力が結果として明確にあらわれ、学習の効果が実感できるので楽しいです。
プログラミング学習コンテンツのような、単に問題を解いていくのとは違い、ゲーム感覚で学ぶことができるので、モチベーション維持にもつながるでしょう。
もし問題が解けなかったとしても「どうすれば解けたのか?」の答え合わせをするだけで良い勉強になります。
学習コンテンツなどでインプットした後に、競技プログラミングでアウトプットすることで、良い刺激になり、プログラミング学習がさらに楽しく学べます。
就活などでアピールできる
最近では、企業の採用活動でも競技プログラミングへの注目度が高まっていて、知名度の高いコンテストで高い点を獲得しただけで、内定が容易に決まるケースもあります。
初心者ならばなおのこと、実務経験でのアピールができない分、こういったものを活用してスキルレベルを提示するのも良いでしょう。
また、直接就職につながるコンテストもあります。
代表的なものとして、「ドワンゴの挑戦状」があります。
ドワンゴの挑戦状」では、入賞者への賞金授与がある他、新卒採用選考参加の場合に利用できる『面接パス権』の進呈や、予選結果を『技術アピール』として利用することができます。
他にも、Google Code Jamなど大きなコンテストで入賞すれば、様々な企業からの仕事のオファーを得られることがあります。
こんな感じで、競技プログラミングは、就職や案件を獲得するチャンスにもなります。
競技プログラミングにおすすめの言語4選
C++
競技プログラミングにおいて、もっとも主流で、おすすめなプログラミング言語はC++です。
他の言語よりも実行速度が早いので、スピードが求められるソフトウェアに用いられます。
競技プログラミングでは、実行速度が遅いと正解と認められないケースもあります。
そのため、C++を使用したほうが有利なんです。
C++は、C言語の上位互換です。
なので、まずはC言語を習得した後に、C++を学習しましょう。
Python
Pythonは、競技プログラミングで使われることが増えているプログラミング言語です。
実行速度はC++に比べると、遅いのですが、コードがシンプルで習得しやすいです。
Pythonは、日本でも人工知能などの開発に使われており、需要が高い言語なので、実務にも役立つ言語を習得したい方におすすめです。
Java
Javaは、C++と並んで、競技プログラミングで使用されることが多いプログラミング言語です。
Javaを仕事で使っているという方も多いのではないでしょうか。
実行速度はC++よりやや遅い程度。
複数の処理を行えるメソッドが利用できる点が、競技プログラミングにおいても有利です。
JavaScript
JavaScriptは、WebサイトやWebサービスにおいて必須ともいわれている言語です。
C++やJavaと比較すると実行速度がやや遅いので、競技プログラミングに使われるシーンは多くありませんでした。
しかし、アップデートによって、JavaScriptのコードが書きやすくなったり、ライブラリが増えたりしたことで、実務で使用することが増えました。
また、実行速度はPythonよりも早いと言われています。
以上の点から、競技プログラミングに使用する言語の候補として考えても良いかもしれません。
競技プログラミングの過去問
ここでは、AtCoderの過去問を3問紹介します。
競技プログラミングに挑戦してみたい人は、ぜひ力試ししてみましょう!
第1問
引用元:A – Product
問題文
二つの正整数 aa, bb が与えられます。 aa と bb の積が偶数か奇数か判定してください。
制約
・1≤a,b≤100001≤a,b≤10000
・aa, bb は整数
入力
入力は以下の形式で標準入力から与えられる。
a b
出力
積が奇数なら Odd と、 偶数なら Even と出力せよ。
解答例
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> using namespace std; int main() { int a, b; cin >> a >> b; int c = a * b; if (c % 2 == 0) cout << "Even" << endl; else cout << "Odd" << endl; } |
第2問
引用元:B – Shift only
問題文
黒板に NN 個の正の整数 A1,…,ANA1,…,AN が書かれています。
すぬけ君は,黒板に書かれている整数がすべて偶数であるとき,次の操作を行うことができます。
・黒板に書かれている整数すべてを2で割ったものに置き換える
すぬけ君は最大で何回操作を行うことができるかを求めてください。
制約
・1≤N≤2001≤N≤200
・1≤Ai≤1091≤Ai≤109
入力
入力は以下の形式で標準入力から与えられる。
N
A₁ A₂ … An
出力
すぬけ君は最大で何回操作を行うことができるかを出力せよ.
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <iostream> using namespace std; int N; int A[210]; int main() { cin >> N; for (int i = 0; i < N; ++i) cin >> A[i]; int res = 0; while (true) { bool exist_odd = false; for (int i = 0; i < N; ++i) { if (A[i] % 2 != 0) exist_odd = true; } if (exist_odd) break; for (int i = 0; i < N; ++i) { A[i] /= 2; } ++res; } cout << res << endl; } |
第3問
引用元:C – Otoshidama
問題文
日本でよく使われる紙幣は、10000円札、5000円札、1000円札です。以下、「お札」とはこれらのみを指します。
青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が N枚入っていて、合計で Y円だったそうですが、嘘かもしれません。
このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。
なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。
制約
・1≤N≤20001≤N≤2000
・1000≤Y≤2∗1071000≤Y≤2∗107
・NN は整数
・YY は 10001000 の倍数
入力
入力は以下の形式で標準入力から与えられる。
N Y
出力
N枚のお札の合計金額が Y円となることがありえない場合は、-1 -1 -1 と出力せよ。
N枚のお札の合計金額が Y円となることがありうる場合は、そのような N枚のお札の組み合わせの一例を「10000円札x枚、5000円札y枚、1000円札z 枚」として、x、y、zを空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> using namespace std; int main() { int N, Y; cin >> N >> Y; int res10000 = -1, res5000 = -1, res1000 = -1; for (int a = 0; a <= N; ++a) { for (int b = 0; b + a <= N; ++b) { int c = N - a - b; int total = 10000*a + 5000*b + 1000*c; if (total == Y) { res10000 = a; res5000 = b; res1000 = c; } } } cout << res10000 << " " << res5000 << " " << res1000 << endl; } |
競技プログラミングの参加方法
ある程度学習したら、さっそくプログラミングコンテストに参加しましょう。
参加方法は、競技プログラミングサイトに応募するだけでOKです。
ここでは、おすすめの競技プログラミングサイトをご紹介します。
AtCoder.jp
毎週末の夜にコンテストが開催される人気の競技プログラミングサイトです。
日本語訳された問題文が用意されているので、英語が読めない方でも参加することができます。
また、競技プログラミングの練習問題が公開されているので、そこで競技プログラミングの実力を鍛えられます。
ドワンゴや日立製作所、パナソニックなど、日本の大企業により主催されるコンテスト開催されています。
パソコン甲子園
パソコン甲子園は、福島県にある会津大学などが中心となって開催されている、高校生向けのパソコンを扱うスキルを競う大会です。
その中のプログラミング部門が競技プログラミングです。
現在高校生で、プログラミングスキルに自信のある方は、参加してみてはいかがでしょうか。
Google code jam
Google Code Jamは、Googleが主催する世界中のプログラマーを対象とした、競技プログラミングコンテストです。
累計4万人近くのプログラマーが一挙に参加する、年に1度の大規模な大会です。
競技プログラミングの中で最も認知度が高く、もし、上位に入賞すれば、エンジニアとして高く評価されるでしょう。
まとめ
今回は、競技プログラミングとなんなのかについて解説しました。
競技プログラミングに参加することで、自分のプログラミングスキルを目に見えるかたちにすることができます。
プログラミングを学習中の方や現役プログラマーの方は、ぜひ参加してみましょう!