とある地方大学生の生き方

学生。主にプログラミング関連の記事を書きます。

地方の大学生が競プロに触れた感想。


競技プログラミングとは、プログラミングコンテストの一種で、
与えられた問題をコードを書いて解決して、その速さや正解した問題の難易度を競うものです。

有名どころで、高橋直大氏が運営するAtCorderがあります。

AtCoder:競技プログラミングコンテストを開催する国内最大のサイト



ゲームを制作するサークルでの活動でプログラミング(Unity/C#)を行う機会があり、後輩がAtCorderに長い期間ハマっているようだったのでやってみることにしました。

実際にあったやりとり…
後輩:「先輩、この問題できないですか?コード書けるんですよね…?」
私:「え?どれどれ…。(なんだこの問題文、数学の入試問題っぽい…?一瞬で解ける気がしない…。)」

主に競技プログラミングやAtCorderに興味がある人向けに
大学で一通りプログラミングの知識を得た自分から見たAtCoder競技プログラミングに対する感想や印象を述べたいと思います。





手厚い情報元で初心者でもとっつきやすい

まず、AtCorderはプログラミング言語C++で行うことが勧められていました。(解説などはC++Pythonで説明されることが多い)
普段からC#を使っており、C系の言語に自信があったのでボクもC++を使ってみることに。

AtCorder公式サイトには、「C++入門 AtCoder Programming Guide for beginners」通称APG4Bと呼ばれる、C++の解説ページがまとめられていました。
C++入門 AtCoder Programming Guide for beginners (APG4b) - AtCoder

テキストベースですがところどころスライドも存在し、かなり読みやすいと思いました。


また、AtCorderでは今までのコンテストの既出問題がアーカイブとして残されており、解説もまとめられていました。
YouTube上で行われている解説放送のリンクも問題解説ページに置かれており、こちらも分かりやすく、計算量やデータ構造など、
自分が今まで意識することが無かった知識に触れることが出来ます。



初心者でも簡単な問題はたくさんあった

一通りC++の基礎文法や配列操作の知識が揃ったところで、実際にコンテストに出題される問題を解いてみました。

AtCorderのコンテストにはA問題B問題C問題...と難易度ごとの問題が出題されます。

A問題は優しく、for文やif文が分かれば解けるので、競技プログラミングが難しそうだというイメージが払拭されました。
(ただしC問題以降は相変わらず私にとって難しい…)



外部サイトが便利

AtCorder Problemsというサイトがあり、こちらは、AtCorderの過去問がまとまったサイトです。
AtCorderのIDを使って今まで自分が解いた問題を参照して、一覧に可視化してくれる画期的な機能もあり、めちゃくちゃモチベーションアップに繋がります。

https://kenkoooo.com/atcoder/#/table/



普段の自分とは全く異なるコードの書き方が吸収できる

特に独学でプログラミングを学んでおられる方や、少人数で何か開発しておられる方に対してメリットかもしれませんが、
競プロでは解説で積極的に他人のコードを読む機会があり、そこから得られるものがあると感じました。

  • 記述量短縮の方法が分かる
  • 同じ問題でも異なる実装方法
  • 他人のコードを読むのになれる?

まだプログラミングの知識が浅いときは、以下のような、{ }を使わずに制御文を1行でまとめる書き方になじみが無く、
マクロという存在自体知りませんでした。また、初心者であるが故に、冗長な書き方をしてしまっている部分もありました。

for(int i = 0; i < n; i++) sum++;

競プロで積極的に使われるrep(repeatの略)と呼ばれるマクロ

#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++) // forのマクロを組んでいる

int main() {
  rep(i, n) sum++;
}

自分と他人が書くコードの違いを比べて、良いところは輸入したり、
記述量の短縮を狙う人のプログラムを理解したりなど、集団で開発をする上で、メリットになると感じました。

※マクロ等の使用は集団開発において、大きく可読性を下げる可能性があるので使用には注意が必要。



時間のあるプログラミングが好きな学生にとっては有利かも

AtCorderのレートは高さによってランク・色分けされています。以下レートが高い順。
灰→茶→緑→水色→青→黄→橙→赤

灰色は参加すれば誰でも到達出来る領域ですが、茶色は学生で到達するとかなり優秀だそうです。
茶色に到達する頃には、様々なアルゴリズムの知識や続ける力、考える力が身につきそうだと思いました。

就活でもメリットになるかもしれません。



レートの色を変えるには数ヶ月~半年ぐらいかかりそう

入茶には、それまでの過去問を解いていき、数ヶ月から半年ぐらいかかりそうな雰囲気でした。
大学生は、時間を持て余している人で、プログラミングは習得したけど、次に何をしたら良いか分からないと思っている人は、
AtCorderで入茶を目標にしてみるのも良いかもしれません。

レートを上げるのを目標にしなくとも、AtCordeのA問題,B問題をやってみるのも楽しいですよ。






競技プログラミングで身につかないこと

競技プログラミングだけでは身につかないなと思った部分もありました。

  • オブジェクト指向プログラミング
  • ネットワークやデータベース、セキュリティなどの知識
  • 集団で開発するためのマネジメント力

競技プログラミングの世界でのプログラムや文化は、他とは違うなと思う部分も多かったので、

  • コードは誰から見ても綺麗にかかなくて良い
  • 自分さえ分かれば良いのでマクロを組んで書く量を短縮
  • 配列のインデックス番号は必ずしも0を使わない

など

将来プログラミングやIT技術を使った仕事をしたい人は、競技プログラミングだけにこだわらず、様々な分野の知識も取得することをオススメします。

個人的には、WEBアプリの開発やゲーム制作、Pythonでの自動化やデータ処理、何か企業のインターンや技術系のバイトに参加すること等でも
初心者や大学生にでもプログラミングで目に見えるものを作りやすくて面白い体験になると思います。