テクノロジー
学生時代、AtCoderに熱中した理由【競技プログラミングとは】
はじめに
今回は学生の頃に熱中していたAtCoder、そして競技プログラミング(競プロ)についてのお話を書かせて頂きました。AtCoderは世界最大規模の競技プログラミングコンテスト運営サイトです。2021年6月にはユーザー数が全世界合計で30万人を超えています(参考サイト)。
今回この記事を書いてみようと思った理由はいくつかございますが、学生の頃の記憶が薄れる前に書いておきたいと考えたことと、競プロとはどんなものであるかだけでも、より多くの方に認知して頂きたいことの2つが主な理由です。
競プロとはどんなものなのかという紹介から、私から見た競プロについて書かせて頂きました。
気になった箇所だけでもいいので、読んで頂けますと幸いです。
1. AtCoderの概要
1.1. 競技プログラミングとは
競技プログラミングは、プログラミングコンテストの一種であり、「与えられた問題を解くプログラムのコードを書く技術」を競う競技です。このコンテストを開催しているサイトの一つがAtCoderです。各コンテストにおいて参加者が以下の観点で評価され、順位づけされます。
- 解くことのできた問題の数
- コーディングにかかった時間
- コーディングの正確性
問題と点数
以下の様な問題がいくつか出題されます。
問題は「AtCoder Beginner Contest 172」から引用しております。
このように簡単な問題から、
このようにパッと見では分からなそうな難しい問題まであります。
こういった問題を解くプログラムのソースコードを提出すると、運営側が用意したいくつかのサンプルデータを入力値としてそのプログラムが実行されます。全ての入力値に対して、提出したソースコードの実行結果と、運営が用意した正解が一致した場合に得点が加算されます(一部のみが一致した場合に部分点を与えているケースもあります)。
得点は難しい問題ほど高くなります。上記の「A - Calc」は配点が100点、「D - Sum of Divisors」は配点が400点と記載されています。一つのコンテストにはあまり難しくない100点の問題から、かなり難しい問題まで幅広く用意されており、初心者でも参加する敷居が低いと言えるでしょう。
コーディング速度と正確性
得点が同じ参加者はコーディングが早かった順(提出が早かった順)に順位が高くなります。
また、実行結果が以下のいずれかに該当する場合、ペナルティが課されます。
- 正解と出力が一致しなかった場合
- 実行時エラーが発生した場合
- 実行時間が制限時間をオーバーした場合
この時、「ペナルティ回数×10分」と言った形で、提出時間が長く見積もられるようになります(AtCoderの場合)。そのため順位を高くするためには、コーディング速度だけではなく正確性や、計算量の見積もりも重要になってきます。
1.2. レーティングシステム
全てのユーザーはレートという値を持っています。この値がユーザーが持つ技術の指標となります。
簡単に言うとこの値が高い人ほど競プロの実力があると言えます。
レーティングは以下の特性を持っています。
- 参加したコンテストの順位に応じて変化し、成績がいいほど数値が増加する。
- 自分よりレートが高い人よりも順位が高ければ高いほど、大きく増加する。
- 逆に自分よりレートが低い人よりも順位が低ければ低いほど、大きく減少する。
- レートの値に応じて色が付与される。
- これこそよく言われる「AtCoderの色」のことである。
- 色について詳しくはこちら。
実際の私のレート推移がこちらです。
ユーザーはいつでもこのグラフを見ることができます。
最後の日付が昨年なことは気にしないでください…。
具体的な計算方法はこちらが参考になりそうです。複雑で私もよく分かっていないです。AtCoderに取り組む人の大半はレートを大きくすることが目標だと言うことができるでしょう。
2. 学生が取り組む理由
AtCoderのユーザーは学生が多いです。(参考URL)
学生がAtCoderに取り組む理由は様々あると思いますが、この記事では私とその友人がAtCoderに取り組んでいた理由を書かせて頂きます。
2.1. 勉強になる
競技プログラミングでは以下の知識・技術が問われます。
- アルゴリズムに関する知識とその応用
- 動的計画法、幅優先探索、深さ優先探索などの有名アルゴリズムの知識が身に付きます。
- これらのアルゴリズムを適切な場面で利用・応用し、コーディングする技術が身に付きます。
- 計算量の見積もり
- 実行時間が制限時間をオーバーすることが無いようにするためには、計算量(計算時間)を正しく見積もる必要性があります。
- 一般的な情報・プログラミング言語の知識
- 「int型変数の最大桁数」などに理解が無いとオーバーフローを起こすように設定された問題もあります。
- 数学の知識
- 数学の知識が役に立つ場面や問題もあります。
- 上記の「Sum of Divisors」という問題も数式を他の形で書き換えるという工夫が役にたちます。
競技プログラミングのレートを上げることはすなわち、これらの知識を身に着けることと同義です。こういった知識・技術を身に着けるために競技プログラミングに取り組んでいる学生が多くいることでしょう。
2.2. 就活になる
これが目的の学生も多くいます。私もその一人でした。以下が存在することから、AtCoderが就活になると言えます。
- AtCoder Jobsの存在
- 企業コンの存在
AtCoder Jobsの存在
AtCoderには、「AtCoder jobs」という求人紹介サービスが存在しています(こちら)。こちらには、様々な求人情報が掲載されており、「レートが1200以上の方限定」と言った形で、一定の実力を持つ人材のみに向けた求人も掲載されております。これによりレートを上げることで就活を有利に進めるため、AtCoderに取り組む学生が多い訳です。
また、AtCoderユーザーに向けた合同説明会もマイナビと共同開催されています(参考)。
企業コンの存在
コンテストの中には、「企業がスポンサーしているもの」が存在しています。これが企業コンと呼ばれているものです。
企業コンでは、以下のメリットがあります。
- 企業コンの参加者向けに企業から直接メールが来ることがある。
- 賞金が出ることがある。
こういった企業コンの存在も、就活の一環としてAtCoderに取り組む一因となっています。
2.3. 楽しい
自分が勉強し、練習すればするだけ、自分のレートや順位が上がる。これと似たものが世間には存在しています。
そう、オンラインゲームです。
シンプルにこのAtCoderのゲーム性が楽しくて取り組んでいる人も多いでしょう。私も自分のレートが上がった時の達成感を求めて、勉強したり、過去問に取り組んだりしていました。
3. 競プロで身につく技術・知識
「2.1. 勉強になる」で記載した内容と重複もございますが、以下の技術・知識が身につくと思っています。
- アルゴリズムに関する知識とその応用
- 動的計画法、幅優先探索、深さ優先探索などの有名アルゴリズムの知識が身に付きます。
- これらのアルゴリズムを適切な場面で利用・応用し、コーディングする技術が身に付きます。
- 計算量の見積もり
- 実行時間が制限時間をオーバーすることの無いようにするためには、計算量(計算時間)を正しく見積もる必要性があります。
- 余計な工夫をすることなく愚直な実装を行うという選択を行うことも時には必要です。この選択を行うためにも、計算時間の見積が必要と言えます。
- 一般的な情報科学・プログラミング言語の知識
- 「int型変数の最大桁数」などに理解が無いとオーバーフローを起こすように設定された問題もあります。
- 浮動小数点の扱いによっては桁落ちが発生する問題等もあります。
- コーナーケースへの意識
- 全ての入力に対して正解を計算するためには、「入力が0の時」や「入力が最大値の時」といったコーナーケースへの処理を正確に行う必要があります。
- 数学の知識
- 数学の知識が役に立つ場面や問題もあります。
- 上記の「Sum of Divisors」という問題も数式を他の形式で書き換えるという工夫が役にたちます。
以上は筆者が思いついたものだけであり、これ以外にも身に着けることができる知識はあるかと思います。
4. 競プロでは身につかない技術・知識
競技プログラミングは特定の知識に特化した競技です。水泳でクロールの練習だけをしていても、個人メドレーで勝てるようにはなりません。同じように、競技プログラミングの勉強をするだけでは、プログラミングの全てを学ぶことはできません。そのためここでは、競技プログラミングでは身につかない技術・知識にもフォーカスを当ててみようと思います。
4.1. 可読性が高いコーディング
競プロにおいて、コーディング速度は命です。そのため、競プロにおけるコーディングでは以下を行っている人が多い印象があります。
- コメントは書かない。
- 変数名・関数名はできるだけ短くする。その場で用途が分かればいい。
- "count"という変数を使っていたら、友人に「"cnt"の3文字でいいだろ!」と怒られました…。
この辺りが原因となり、私も自分で書いたコードを見直したら、何が書いてあるのか分からなかったことが何度もあります。そのため競技プログラミングに取り組むだけでは、「可読性が高いコーディングを行う技術」は身につかないと言えるでしょう。
もちろん競技プログラミングの実力を上げるには「復習」も大事になります。そういった点で言うと、「可読性が低いコードを読む技術」は身につくかもしれません。
4.2. アプリケーション開発の知識
これは「競プロをやっていた自分が、学生時代に学ぶことができていなかった知識」です。具体的には以下の知識・技術が挙げられます。
- ライブラリ・フレームワークの使い方
- 一部ライブラリは使いますが、アプリケーション開発で使うようなGUIを提供するものなどは一切使わないと言えます。
- 処理速度とサービス内容のバランス感覚
- サービスの内容によっては処理速度を犠牲にする必要もあります。こういった複合的な判断を行う技術は身につかないと言えます。
- GitやIDEなど様々なツールの使い方
- エディタさえあればなんとかなります。最悪エディタがなくてもなんとかなります。
- チーム開発や開発工程、プロジェクトマネジメントの知識
- そもそも個人で取り組むものが大半です。チームで参加する大会も存在はしていますが、チーム開発とは少し違うと思います。
こうした開発に関わる知識に関しては、競技プログラミングで学ぶことができないと言えるでしょう。
4.3. その他情報関連の知識
アルゴリズムというものに特化した競技である以上、コーディングと直接のかかわりが少ない、以下の分野の知識については、競プロを通して学ぶことは難しいと思います。
- サーバーやネットワークなどのインフラに関する知識
- セキュリティ対策
- SQLなどのDBに関わる知識
このように競プロだけでは身につかない知識は多くあるかと思います。
5. 終わりに
競技プログラミングは昔から賛否両論ある文化だと聞いています。実際メリットはあるものの、これだけでは不十分であるということはこの記事からも分かると思います。
しかし、勉強の一環として取り組んだり、趣味として楽しむものと考えると、様々なリターンがあるとてもいい文化ではないでしょうか。
※本記事は2022年10月時点の内容です。