競技プログラミングは” ”に役に立つ
2025年10月28日

お疲れ様です!
25卒の工藤翔太と申します。
本記事は、第6回技術発表会の発表内容となります。
競技プログラミングとは?
みなさん、「競技プログラミング」をご存知でしょうか? エンジニアの方であれば、存在を知っている方は多いのではないかと思います。 中には取り組んだことのある方もいるかも?
競技プログラミングとは、「決められた条件のもとで与えられた問題、課題をプログラミングを用いて解決し、その過程や結果を競うもののこと」を指します。
要は、問題を速く、多く、ミスなく解いた者が偉いゲームです。
巷では、「貴重な週末の夜を、プログラミングの問題を解くという訳のわからないことに時間を費やして悦に浸る集団が、「オンラインゲーム」と呼んでいるもの」と揶揄されています。誠に遺憾ですけども、「一種のゲーム」だと思っていただいて良いかと思います。
そこで今回の発表では、日本で最も一般的な競技プログラミングコンテストサイト「AtCoder」について紹介したいと思います。
AtCoderとは?
では、AtCoderについて説明します。 ご存知の方も多いと思いますが、AtCoderは日本最大級のプログラミングコンテストサイトです。世界では80万人以上、日本でも30万人以上のユーザがいます。また、ヒューリスティック系やアルゴリズム系などいろいろなコンテストが開催されていますが、今回は最もポピュラーなコンテスト(ABC:AtCoder Beginner Contest)について紹介いたします。
ABCとは?
コンテストの特徴として、毎週土曜日の21時から開催されており、誰でも参加することができます。また、A~Gの7問が与えられ、どんどん難しくなっていく形式になっています。これらの問題を100分以内に解いて順位を競います。
下記画像の通り、ミス数、時間、問題数によって順位が決まっています。

「100分で7問?全部解けそうじゃね?」と思った方もいるのではないでしょうか。
その感覚は正しいと思いますが、最後のG問題を時間内に解けるユーザはほとんどいません。先週のコンテスト(上記画像)では、全完できた人は4人しかいないですね。(1人も出ないときもあります)
AtCoderの「色」とは?

AtCoderに一度でも興味を持った方であれば、「色」の概念についてなんとなく知っているのではないでしょうか。
AtCoderにおける「色」とは、実力を示す段階的な称号のようなものです。 そのレーティングによって、400刻みで決定します(瓦・段位という概念もございますが、ここでは省略)。 AtCoderの世界では、この色によって偉さが決まるのです。
レートによって灰色・茶色・緑色・水色・青色・黄色・橙色・赤色があります。 ※厳密には黒色・銅色・銀色・金色もありますが、割愛させてください。気になる方は調べてみてください!
この「色」の概念はとっても大事なので、一色ずつ紹介していこうと思います。
灰色
AtCoderに登録すると付与される、最初の色です。 これで精進量を可視化することはできないので、能力を保証することはできません。 ただ、灰上位と呼ばれる区分(147~399)に今後新しい色が追加されるかもしれないそうです。 個人的には、灰下位と灰上位にも大きな実力差があると思っています。
茶色
初めての色変で到達するのが茶色です。 基本的なアルゴリズム(二分探索/累積和/深さ優先探索/幅優先探索)などが理解、簡易的なものが実装できると到達できます。 公式からの評価は、「コーディングへの安心感がある程度持てる」とのことです。 また、paiza等の他サイトのコーディング能力だと茶色の時点でSランク(最高評価)に達します(一般的に)。 なので、想定しているレベル感より多少高いのではないかと思います。
緑色
コーディングの安定感、速度に信頼がおけると評価されているのが緑色です。 正直、この色までいくと業務で発生する処理に求められる能力はカンストします。 アルゴリズムに重きを置いている企業だとこの色だと満足できないかもですが・・。 ちなみに私はこの色です。競プロを始めて1年ちょっとで到達しましたが、2年たった今もこの色です・・・。
水色
アルゴリズム能力・数学能力においてかなりのスキルを持っています。ITエンジニアにはこの色はもはや必要ないです。未経験からこの色に到達するのはほぼ無理ですね。5年以上競プロを続けてもこの色になれないユーザも多数います。この色から、ARCというコンテストに参加することができるようになります。 学生で水色のRatingを所持していたら、間違いなく無双できますね。
青色
ここからは全員化け物です。 この色に到達しているユーザは全体の5%程度です。複雑なアルゴリズムを何食わぬ顔で実装することができます。 学生時代をすべて競プロに費やしたとしても、到達できない学生は山ほどいます。 アルゴリズムの研究職とかでもバリバリ活躍できる色になります。
黄色
化け物です。競プロの問題を解く機械だと思った方が良いです。 このレートから、AGCというコンテストに参加できるようになります。 学生でも、この色を所持しているのは東大・京大・東工大などの競プロ強豪校にしか基本的にいません。 この色あたりから、「プログラミング能力」という物差しでスキルを測ることができなくなります。
橙色
アルゴリズムの研究職ですら希少種というレベルです。というか日本には100人程度しかいません。 アルゴリズムの国内大会で、個人戦においてもTOP10入りを目指す可能性のある競技者です。 僕の身の回りにこの色以上を保有しているユーザは知りません。
赤色
化け物界のトップです。日本には50人程度しかいません。 多分僕が人生を競プロに捧いだとしてもこの色にはなれません。 このレベルになると、世界大会に招待されたりします。ちなみに、AtCoderの社長はこの色です。
という感じで、これだけ色の種類があるなら」「ユーザの平均は水色・青色」あたりか?と思う人もいるんじゃないかなと思います。
けっこう違います。

そもそも、AtCoderのユーザの70%は灰色です。茶色も含めると85%を締めています。なので、水色は大体上位6%程度です。
この認識のギャップが競プロをやめてしまう原因なんじゃないかと思います。 なので、本質的にはレーティングを忘れて楽しむことが大事だと思います(色も大事だけど)。
どんな問題が出るの?
今回は、代表的なアルゴリズム「二分探索」の問題を取り扱ってみます。
この問題を見ただけでは、いまいち何を問われているかピンとこないと思います。
言葉で説明するのはなかなか難しいのですが、以下にわかりやすく説明を書いてみました。
まず、
- ▸長さ N の整数の並び(配列) A が与えられています。
- ▸この配列はすでに 小さい順(昇順)に並んでいます。 そして、もうひとつ 整数 K が与えられます。
配列 A の中から、 「A[i] が K 以上になる最初の場所(インデックス)」を探すことです。
つまり、A[0], A[1], A[2], … と順番に見ていって、 最初に K 以上になるところの i(場所の番号) を出力します。
もし、配列の中に K 以上の値が1つもないなら、 「-1」と出力します。
考え方のコツ
単純に考えると、A[0], A[1], A[2], … のように 左から順番に調べていく方法が思い浮かびます。
しかし、その方法だと、最悪の場合 すべての要素を確認する必要があります。 たとえば N が 100,000 のように大きい場合、 1 つずつ確認するのは時間がかかってしまいます。
ここで大事なポイントは、
配列 A が すでに昇順(小さい順)にソートされている ということです。
つまり、
- ▸ある位置までは A[i] < K
- ▸そこから先は A[i] ≥ K となるような「境目」が必ず1か所存在します。
この「境目」を見つけるために有効なのが、二分探索(binary search) です。 二分探索を使えば、配列の長さが10万でも、 およそ17回程度の比較で答えを求めることができます。
ちなみに、解答をc++で書いてみると下記のようになります。
※分かりやすくbinary_searchで記述しています。lower_boundなどを使って実装する手もあります。
#include<iostream>#include<vector>usingnamespace std;
intmain(){// N: 配列の長さ, K: 探したい値int N;longlong K; cin>> N>> K;
vector<longlong>A(N);for(int i=0; i< N; i++){ cin>> A[i];// 配列の値を入力}
// 二分探索の範囲を設定int left=0;// 探索範囲の左端 (含む)int right= N;// 探索範囲の右端 (含まない)
// 二分探索のループwhile(left< right){int mid= left+(right- left)/2;// 真ん中のインデックスを計算
if(A[mid]>= K){// A[mid] が K 以上なら、この mid 以降の範囲もチェックする right= mid;}else{// A[mid] が K 未満なら、mid より右側をチェックする left= mid+1;}}
// left が配列の範囲内で、A[left] が K 以上かを確認if(left< N&& A[left]>= K){ cout<< left<< endl;// 最小のインデックスを出力}else{ cout<<-1<< endl;// そのような値が存在しない場合}
return0;}
このようにして、どのようにして計算量を高速化してアルゴリズムを最適化するのか、を考えるのが競技プログラミングです。
面白そうじゃないですか?
競技プログラミングは” ”に役に立つ
ここにきてタイトル回収させていただきました。
自分が競技プログラミングを始めて2年、「こういう箇所が役に立ったなあ・・」と思ったことをいくつか挙げてみます。
おそらく人によるものですし、実力のある人はもっといろんなところで役に立っていると思いますので、ほんの一例として浅く受け取ってくださると助かります。
①競技プログラミングは” コーディングスキル向上 ”に役に立つ
まあめちゃくちゃコードを書くのでそりゃそうではあるのですが、ここでいうコーディングスキルはそういう経験量の観点ではございません。
たとえば、複雑なシステムにおいて、もっとも実行に時間がかかってしまっている部分(ボトルネック)の解消であったり、DBを設計する上でのクエリの最適化などがあげられます。
私は基本的にフロントエンドを実装することが多いのですが、個人的にはコードレビューの品質が向上するような気がします。純粋なコードへの嫌悪感が払拭されている感はありますね。
ですが、これらはあくまで一例ですし、「このアルゴリズムがダイレクトに業務に活きたぜ!」と感じたことは今のところないです。
②競技プログラミングは” ポートフォリオの充実 ”に役に立つ
私が就活で実際に受けが良かったという実体験を踏まえてでもありますが、競技プログラミングのレートは普通にスキルシートに書けます。競技プログラミングのレベル感を理解している企業であれば、茶色からでも十分に評価されると思います。ITの基礎的な資格と同じくらいアピールできると思っていいと思います。
ちなみに個人的な所感では、
Iパス<基本情報<AWS CLF<AtC茶<AWS SAA<応用情報<AtC緑<高度情報 = AtC水<…
くらいの難易度です。高度情報は持っていませんが・・
③競技プログラミングは” 問題解決への集中力 ”に役に立つ
競プロerの方々は、コンテストのたびに100分間脳みそをフル回転して問題に取り組んでいます。なので、「コードを書くこと自体への集中力」「問題を解決するための没頭力」が半端ないんですよね。
これは業務にも全然活きる部分で、実装に詰まったときの集中力は結構自信があります。没頭しすぎて「早く先輩に尋ねるべきだった!」と感じることもしばしばありますが・・^_^;
④競技プログラミングは” 自信 ”に役に立つ
私的にはこれが最も大きいメリットだと思います。
競技プログラミングを精進するということは、基本的に挫折・懊悩・希死念慮の連続なんです。Ratingを気にしすぎると、本格的にメンタルを病むこともあります。(ありました。)
競プロって結構センスで左右される世界でもあります。
おそらく一般的なITエンジニアが競プロを始めると、最初は茶色になること自体に結構時間がかかると思いますが、3か月で水色になってしまう高校生もいたりします。
なので、「自分より後に始めた人にレートを抜かれた」「自分は1,000問解いてやっと茶色なのにあの人は10問程度を解いて茶色になっていた」なんてことがざらにあります。
おそらくこのあたりが、競技プログラミングで挫折してしまうユーザの主な理由だと思うのです。実際、競技プログラミングを大学でいろいろなひとに勧めていたのですが、ほとんどの人は1か月を経たずしてやめてしまうのです。
なので、その中で継続して頑張ってきた、〇色になれたという事実は圧倒的な自信になるのです。
おわりに
競技プログラミングは、0円でできるコスパ最強のゲームです。
初期費用も受験料も一切かかりません。
また、競技プログラミングを「スキルアップの手段」と捉えた場合、きっともっと良い手法があると思います(資格取得、個人開発など)。ですが、「趣味の一環」と解釈するとあまりにも有益なのです。なので、「なにか新しい趣味が欲しいけど、どうせならスキルに役立つものが良いな」という人にはめちゃくちゃおすすめできます。
さらに、自分のペースで取り組むことができるのもポイントです。資格取得のように、目標を立てて、受験日を決めて、取り組むようなものではありません。しんどくなったら離れれば良いし、またやりたくなったら始めればいい。「やりたいときにやる」オンラインゲームなのです。
それでは、良い競プロライフを・・!