Studyplus Engineering Blog

スタディプラスの開発者が発信するブログ

競プロ勉強会を開催しました

はじめに

2023年7月からWebアプリケーショングループの内定者インターンとして働いている羽鳥です。
インターンでは研修としてRuby、Ruby on Rails、RSpec、データベース設計、オブジェクト指向プログラミング、Reactなどを学んでいます。

私は趣味で競技プログラミングに取り組んでおり、社内勉強会の開催を提案していただいたので、競技プログラミングの勉強会を開催しました。
この記事ではその勉強会についてお話しします。

競技プログラミングとは

競技プログラミングはAtCoderで次のように説明されています。

決められた条件のもとで与えられた問題、課題をプログラミングを用いて解決し、その過程や結果を競うものを競技プログラミングといいます。

引用元:https://info.atcoder.jp/overview/about/competitive

以下、競技プログラミングを競プロと表記します。

意識したこと

勉強会の開催にあたって、以下のことを意識しました。

競プロを全く知らない人でも楽しめる

競プロを知ってもらうというのがこの勉強会の目的だったので、基本的なプログラミングの文法を知っていれば解ける・解説を理解できるような問題に絞りました。
また、解説も平易なものになるように心がけました。

事前準備なしで参加できる

参加のハードルを少しでも下げるために事前準備はなしにしました。
後述するAtCoderのアカウントを事前に作成してもらおうかと考えたのですが、それほど時間がかからないので勉強会の最中に登録してもらう時間を設けました。

実際にプログラムを書いてもらう

競プロは四苦八苦しながらコードを書き、提出して正解することで達成感を得られることが醍醐味の1つだと私は考えます。なので、勉強会の中で実際にプログラムを書いて提出することを体験してもらおうと考えました。

勉強会の内容

勉強会では、以下のことをお話ししました。

  • 競プロについて
  • 実際に問題を解いてみよう
  • 勉強方法

競プロについて

競プロを何も知らない方向けに、簡単に競プロについて説明しました。
また、競プロのサイトであるAtCoder に登録してもらいました。

実際に問題を解いてみよう

AtCoderの以下の2問を解いてもらいました。

Counting Passes

  • 問題文

N 人の人1,2,…,N がある試験を受け、人i はAi点を取りました。
この試験では、L 点以上を取った人のみが合格となります。
N 人のうち何人が合格したか求めてください。

  • 選定理由

基本的な入出力に慣れてもらうことと、正解したときの爽快感や達成感を味わってもらうために出題しました。

  • 計算量
 O(N)
  • 解説

Aの要素を1つずつ走査し、L以上なら答えをカウントするという処理を繰り返せば答えが求まります。

Otoshidama

  • 問題文

日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。
青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札がN 枚入っていて、合計でY 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。

  • 選定理由

計算量について知ってもらうために出題しました。
愚直に全探索する解法では正解できないので、計算量について考える必要があります。

  • 計算量
 O(N^2)
  • 解説

10000円札、5000円札、1000円札の枚数をそれぞれi, j, kとして条件を満たす組み合わせを探索すれば答えは求まります。
しかし、N <= 2000なのでi, j, kを探索すると計算量が

 O(N^3)

となり、この問題の実行時間制限である2秒に間に合いません。
ここで、お札の枚数が全部でN枚になることに着目すると、i, jが定まっていれば1000円札の枚数はN - (i + j)として求まり、kを探索する必要がなくなるので計算量を

 O(N^2)

に落とすことができます。

勉強方法

競プロについて興味を持って頂けた方向けに以下の勉強方法について紹介しました。

  • 過去問を解く
  • コンテストに参加する

また、AtCoderの過去問を解く際に便利なサービスであるAtCoder Problemsも紹介しました。

参加者の感想

参加していただいた方々から、Slackで以下のような温かいお言葉を頂きました!

  • 競プロ勉強会、ありがとうございました!
  • 参加した甲斐がありました。色々と質問にも回答いただいてありがとうございます🙇
  • 先程はありがとうございました!またAtCoderやっていくぞという気持ちになりました💪
  • ありがとうございました〜久しぶりにやって楽しかったです〜🙌 大学時のC言語の授業でこんな問題解いてたな〜と懐かしかったです!

私の感想

「自分なんかが勉強会なんて......」と思ってしまうタイプなので、勉強会開催の提案を頂けて嬉しかったです。
計算量について軽く説明しましたが、改めて自分が説明すると難しかったです。
発表中もコメントをたくさんいただけたので、発表しやすかったのが印象的です。

おわりに

誰でも、どんな内容の勉強会でも歓迎してもらえる雰囲気があり、気楽に楽しく開催できました。
これからも競プロに限らず、様々な技術や知識について勉強会を開催したいと思いました。
開催したらまたブログも書きたいです。