⌨️

ゆるい競技プログラミングのすすめ

に公開

こんにちは。株式会社ココナラ マーケットプレイス開発部DevOps開発グループでエンジニアをしている ぽったー です。

普段はココナラスキルマーケットの機能開発や改善活動をしています。

半年ほど前から、猫を飼い始めました。毎日成長する猫に負けないように日々精進したいと身が引き締まる思いです。

今回は「ゆるい競技プログラミングのすすめ」というテーマで、以前社内LT大会で発表した内容を紹介したいと思います。

弊社の社内LT大会では、業務のことから今回紹介するような技術のことなど、さまざまなトピックが発表されるのでとても勉強になる会となっています。

自己紹介

私はAtCoderという競技プログラミングサイトでレートは緑色でした。最近サボっているので、今やると落ちてしまうと思います。

AtCoderのレーティングは、黒、灰、茶、緑、水、青、黄、橙、赤と色でレーティングの高さを表現しています。赤に近づくほどレーティングが高いことを意味します。

「緑色になれれば、『競技プログラミングに熱心に取り組んでいる人』と考えて問題ないでしょう」と言われています。そのため、自他共にそれなりに競技プログラミングに向き合ってきたつもりです。

競技プログラミングを始めたきっかけは、もともと論理パズルや謎解きといった頭を使う遊びが好きでした。

それに加えて、前職で一時期プログラミングをする機会が減っていました。

プログラミングをしたいが作りたいアプリケーションがない。でも、何かプログラミングを書きたい。

そんな典型的な手段が目的になっている欲を満たすために始めたのが、競技プログラミングでした。

そもそも競技プログラミングとは

競技プログラミングとは、プログラミング課題を解いて速さや正確さを競う競技です。
与えられた問題に対してプログラムを作成し、解くまでの時間や正解数などを競い合います。

要するに、「早く・正確に・効率的に」プログラミングをすることが求められます。

どんな問題があるのかというと、意外と簡単な問題から超難問まであります。

簡単なものだと、「2つの文字列を標準入力から受け取って、1つの文字列に結合した結果を標準出力する」といった問題です。

一方で難しい問題だと、以下のような問題があります。

問題例:寿司屋の食べ放題

ある男性は寿司屋で食べ放題コースを楽しんでいました。男性はダイエットをするために800kcalまでしか食べないことにしています。

それでも1円でも得をしたい男性が「食べたいと思っている寿司1~5」の中から800kcal以内に収まるように何種類か選んだとき、寿司の合計金額の最大値(もっとも元が取れるときの合計金額)を求めなさい。

【寿司】
1. マグロ:150kcal、500円
2. サーモン:130kcal、450円
3. エビ:80kcal、300円
4. イカ:60kcal、200円
5. タマゴ:100kcal、250円

寿司が5種類しかなく、一見簡単に解けそうに見えます。

ですが、これはいわゆるナップサック問題と呼ばれるもので、はじめてアルゴリズムで解こうとすると意外と難しい問題になっています。

競技プログラミングをやって感じたメリット

私が競技プログラミングに取り組むことで感じたメリットは、

「考えることへの基礎体力がついた」

です。とくに、次の3つの効果を感じています

  1. 細かいところまで考えることができるようになった
  2. 業務でコードを書くとき、困ることが減った
  3. ロジックのディスカッションで置いてけぼりが減った

1. 細かいところまで考えることができるようになった

競プロの問題を解くためには次のことが必要です。

  • 複数のいろんなアルゴリズムを試す
  • 複数のアルゴリズムを組み合わせる
  • エッジケースを見つける

これを続けることで、最初はメモ用紙を片手に思考をまとめていましたが、徐々に頭の中である程度完結するようになりました。

考える力が確実に高まりました。

2. 業務でコードを書くとき、困ることが減った

単純なアルゴリズムとしての問題の複雑さ

競プロ > 業務

もちろん業務内容によりますが、多くのケースで上記のケースが当てはまると思います。

おかげで業務中にどうやって書けばいいのか?と心配する機会が減りました。
そればかりか、どこでどんな処理をやるかや、エッジケースに対して意識を向けられるようになりました。

3. ロジックのディスカッションで置いてけぼりが減った

社内の経験豊富なエンジニアたちがロジックの話をしているとき、ついていけないことが多かったです。

先ほども書いたように、当初はメモ用紙片手に思考をまとめないとついていくことができませんでした。

それがある程度頭の中で考えることができるようになったことで、そのような状況は減りました。

よく聞くデメリットについての私見

これまでメリットのことを書きました。

一方で、競技プログラミングに対してよく聞くデメリットもあります。

よく聞くデメリットは2つです

  • AIを使えば複雑な問題を解かなくても良いのでは?
  • 競プロの人って難解なコード、変なコード書くよね?

これらについて個人的な私見をまとめておきます。

AIを使えば複雑な問題を解かなくても良いのでは?

確かにAIを使えば複雑な問題を解いてくれます。

でも、自分自身の考える力は伸びません。

あくまで自分自身の成長にフォーカスするから、「AI使えば」は関係ないと思っています。

この辺りから、後述する「ゆるい競技プログラミング」をオススメしたいです。

競プロの人って難解なコード、変なコード書くよね?

正直、この意識を持っている方なら心配ありません!

この点を意識している方は、業務でそんなコードを書くことはないでしょう。

また、競技プログラミングに最適化されたコードが書けるようになるのは実はとても大変です。
それを書けるようになれば、十分にすごい技術力の証です。

高い技術力を持って、この意識を忘れなければ、業務で活躍することは間違いないと思います。

「ゆるい競技プログラミング」のすすめ

最後に、これまでのメリットやデメリットを踏まえて、「ゆる競プロの3箇条」を提案します!

ゆる競プロの3箇条
1. 競技コンテストに出なくてよい
2. 15分わからなければ答えを見る
3. 自分を鍛えるためと割り切る

1. 競技コンテストに出なくてよい

コンテストには日時の制約や時間制限があります。

都合によっては、参加できないことは多々あると思います。

そんなときは無理して参加する必要はありません。

2. 15分わからなければ答えを見る

アルゴリズムには知識が必要なため、知らないものは解けないこともあります。

長時間悩むより、解説を見て学ぶこともときには大切です。

とくに、始めたばかりの頃は、自力で解きたいという気持ちが強いと思いますが、ときには立ち止まって学びに徹するのも大切です。

3. 自分を鍛えるためと割り切る

速さよりも、正確さや読みやすさを意識しましょう。実務に役立つスキルを身につけることが目標です。

速さを意識したいと思うとAIで書いた方が速いことは多々ありますし、AIに聞けば解けるケースもあります。

ですが、AIと競う必要もありません。

自分のペースで、自分の成長にフォーカスして問題に向き合う経験こそが、真の実力向上につながります。
AIは道具であって、あなたの思考力を鍛えてくれるものではありません。

競プロを始めるには

競技プログラミングを始めるのに特別な準備は必要ありません。

私が利用していたAtCoderをはじめ、PaizaやLeetCodeなどさまざまなサイトで気軽に始めることができます。

最初は簡単な問題から始めて、徐々にレベルアップしていきましょう。

まとめ

競技プログラミングは難しい問題ばかりではありません。

簡単に始められて、考える力を養うための練習台としてちょうど良いです。

気になったらコンテストに出ればいいですし、出なくても自分のペースで自己成長に取り組むことができます。

ゆるく競プロで、考える力を鍛えよう💪💪💪

最後に

ココナラに興味をもっていただいた方やもっと詳細に話を聞いてみたい方がいましたら、以下カジュアル面談応募フォームよりご連絡ください。

https://open.talentio.com/r/1/c/coconala/pages/70417

また募集している求人については以下をご確認ください。

https://coconala.co.jp/recruit/engineer

Discussion