【競技プログラミング】コンテスト初参加までにやったこと


こんにちは！

私は普段Javaで開発をしています。
エンジニア歴は1年くらいです。

前々から興味があった競技プログラミングのコンテストに初参加してきたので、
参加に向けて取り組んだことや参加した所感を書きたいと思います。

**競技プログラミングの存在を初めて知った方**や、
**興味はあるけどまだやってみたことのない方**の参考になれば幸いです。
- - -
## 目次
[0.はじめに](#0-はじめに)
[1.まず試しに解いてみる](#1-まず試しに解いてみる)
[2.言語選択と環境構築](#2-言語選択と環境構築)
[3.基本問題を解く](#3-基本問題を解く)
[4.コンテストに参加する](#4-コンテストに参加する)
[5.おわりに](#5-おわりに)
- - -
# 0. はじめに
競技プログラミングは簡単にいうと

> 問題に沿ったアルゴリズムを、プログラミングにより実装する能力を競う

競技です。

メジャーな競技プログラミングサイトであるAtCoderでは、毎週末何かしらのコンテストが開催されていて、
コンテストの順位や各コンテストの結果をもとに判定されたレートにより、個人の実力が見えるかたちになっています。

AtCoderのレーティングシステムの特徴として、レートによってユーザーに色がつくというものがあり、
実力の証明や目標設定がしやすくなっています。

レートと色の対応は以下のとおりです。

| レート | 色 |
|:-:|:-:|
| 2800~ | <font color="#FF0000">赤</font> |
| 2400~ | <font color="#FF7700">橙</font> |
| 2000~ | <font color="#AAAA00">黄</font> |
| 1600~ | <font color="#0000FF">青</font>  |
| 1200~ | <font color="#00AAAA">水</font> |
| 800~ | <font color="#007700">緑</font> |
| 400~ | <font color="#774400">茶</font> |
| 0~ | <font color="#777777">灰</font> |

注意点として、1回のコンテストの結果で100以上レートが上がるというわけではないので、
実力にレートが追いつくまで、何度もコンテストに参加する必要があります。

私が普段参考にしている記事にてレーティングについて詳しく解説されていたので、
もっと詳しく知りたい方は以下をご参照ください。

[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン【初級編：競プロを始めよう】](https://qiita.com/e869120/items/f1c6f98364d1443148b3#1-4-%E7%AB%B6%E3%83%97%E3%83%AD%E3%82%92%E3%82%84%E3%82%8B%E5%89%8D%E3%81%AB-atcoder-%E3%81%AE%E3%83%AC%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A8%E3%81%AF)
- - -
# 1. まず試しに解いてみる
競技プログラミングがどのようなものであるか知るためには、
実際に問題を解いてみるのが早いと思ったので、
まずはJavaでいくつか問題を解いてみました。

それぞれユーザー登録が必要ですが、
AtCoderの以下の問題
[AtCoder Beginners Selection | PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)

もしくはAOJの以下の問題
[AIZU ONLINE JUDGE | Problem Set from ITP1 | ITP1_1_A: Hello World](https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_1_A)

を、自分がよく使う言語で解いてみてください。

上記の問題は簡単だと思いますが、実際に出題される問題はより複雑なものになるので、
続けてABSやITP1の他の問題も見てみてください。
（この時点で全て解く必要はないと思います。）
- - -
# 2. 言語選択と環境構築
## 言語選択
競技プログラミングではほぼ全ての言語で参加することができるため、
**基本的には自分の好きな言語で参加すれば良い**です。

ただ、競技プログラミング内の人口としては、C++で書いていいる人が多いようです。
参考書や解説サイトなどの例もC++で書かれているものが多いため、
**学習のしやすさ**と**今まで使ってこなかった言語**という観点で、私もC++を選びました。
（実行速度もJavaやPythonといった他の言語よりも10倍くらい早いようです）

JavaはC++から派生した言語なので、書き方が同じ/似ている部分も多く、
普段Javaを使用している方であれば、C++を書く上で苦労することはあまりないと思います。

C++の学習にあたり、私は以下のサイトを使用しました。
[C++入門 AtCoder Programming Guide for beginners (APG4b)](https://atcoder.jp/contests/apg4b)
- - -
## 環境構築
AtCoderのサイトには「コードテスト」という機能が備わっているため、
エディタ等を使用せずにコードテストにコードを書いて実行し、
期待する結果が得られたら提出するということも可能です。

しかし、エディタを使用する方がコード補完や、コンパイルエラーの表示といった点で便利なので、
私はVSCodeにC++の実行環境を作って、そこで書いたものをコピペして提出しています。
（テストや提出をコマンドライン上で行うこともできるようです）

以下に環境構築の際に参考にしたサイトを記載します。
OSはMacです。（Windowsユーザーの方すみません。）

[M1 MacでC++の競プロ用のGCC環境構築](https://qiita.com/satshout/items/bf5bf7cd20294adc211e)
[MacでGCCを"正しく"環境構築しよう！](https://qiita.com/DaikiSuyama/items/09f5aa399aad37783146)
[【M1以降の Mac, Windows対応】Visual Studio CodeでC/C++を実行する環境を構築する方法](https://www.edp-ken.com/post-8/)
- - -
# 3. 基本問題を解く
C++の実行環境が整ったところで、
再度「[1.まず試しに解いてみる](#1-まず試しに解いてみる)」で記載した基本問題を、
今度はC++で解きました。

私は基本問題（ABSとAOJのITP1）を全て解きましたが、
今になってみると、どちらか片方で十分だったかもしれないと思っています。

コンテストではインターネットでの検索が認められているので、
基本問題を解く際もわからない文法やメソッドは調べながら書いていました。

ただ、その分解答時間は奪われるので、
最終的には見なくても書けるようになるのが理想です。
- - -
# 4. コンテストに参加する
基本問題を全て解き終えたところで、
いよいよコンテストに参加しました。

参加したのは以下のコンテストです。
[パナソニックグループ プログラミングコンテスト2023（AtCoder Beginner Contest 326）](https://atcoder.jp/contests/abc326)

コンテスト終了後も、問題タブから問題を解くことができます。
ただし、ランキングや点数、レートに影響しません。

制限時間100分で問題は7問ありました。
配点は以下の通りです。
| 問題 | 点数 |
|:-:|:-:|
| A | 100 |
| B | 200 |
| C | 300 |
| D | 450  |
| E | 450 |
| F | 525 |
| G | 625 |

今回はB問題までしか解けず、結果は300点でした。
C問題はTLE(Time Limit Exceeded)で完答できませんでした。

コンテストの問題には実行時間制限があり、これをオーバーしてしまうと、
答えが合っていても点数をもらえません。

A、B問題までは計算量を気にする必要がなかったのですが、
C問題以降は計算量や値の桁に気をつけなければいけないようです。

このC問題までを完答できるようになれば、入茶できる（茶色になれる）ようなので、
当面は計算量や値の桁について勉強しつつ、可能な限り毎週コンテストに参加したいと思います。
- - -
# 5. おわりに
「競技プログラミングは実務の役に立たない」という意見をよく見ます。
確かに直接的には役に立たないと思いますし、個人開発等の方が実務に直結するようなスキルが身につくと思います。

そういう意味で、私は競技プログラミングを万人にはおすすめしません。

しかし、全く役に立たないとは思いませんし、
何より楽しいです。

皆さんも役に立つ云々は気にせず、
一度気軽に参加してみてはいかがでしょうか？