AbemaTVでバックエンドエンジニアをしている村松です。

私の所属するAtCoderゼミで、10月23日に社内プログラミングコンテスト「AtCoderゼミ Beginner Programming Contest #1」を開催しました。

この記事では当日の様子も交えて、内容をお伝えします。

AtCoderゼミとは?

CyberAgentにはゼミ制度という、業務時間の一部を研究や技術の向上に使うことができる制度があり、AtCoderゼミはそれらのゼミの中の1つです。

AtCoderゼミでは、AtCoderや競技プログラミングを通して、アルゴリズムや問題との向き合い方を習得することを目標に活動しています。

現在、約8名のメンバーが所属しており、ほとんどが今年に入ってから競技プログラミングを始めたメンバーで構成されています。メンバーのAtCoderのレートは黄色〜茶色まで様々ですが、ボリュームゾーンは緑です。

ゼミの活動内容としては、コンテストの振り返り、アルゴリズムの学習、ライブラリの作成、今回のようなイベントの開催などを行なっています。

今回のコンテストの概要

今回のコンテストは、「CyberAgent所属の競技プログラミングに興味を持つ社員が集い、コンテストを楽しもう」という趣旨で開催しました。

コンテストの問題はAtCoderの過去問を、コンテストのシステムはAtCoder Virtual Contestを利用させていただきました。

コンテスト時間は1時間で、問題セットはAtCoder Beginner ContestのAABCDEくらいの難易度を目安に6問選択しました。

当日のレポート

コンテスト説明

最初の30分は、ゼミ長の西山から、コンテストについての説明やコンテストシステムの使い方などの説明を行いました。

コンテスト

出題された問題

今回のコンテストの参加者は約15名でした。

半数程度がプログラミングコンテスト初参加だったにも関わらず、ほとんどの人が4問目まで解けていました。

問題の難易度的にも適切で、参加者の皆さんにもコンテストを楽しんでもらえたようです。

5問目「Snuke Festival」レビュー

多くの参加者がこの問題に苦戦していました。問題ページ

問題の概要は、与えられた長さN (1<=N<=10^5) のリストA, B, CからAi < Bj < Ckを満たすような組み合わせは何通り作ることができるかという問題です。

解法の例としては、jを固定すれば、iとkの個数は二分探索で求めることができるというものがあります。

競技プログラミングに慣れていない人にとっては、jを固定するという発想や、C++以外の言語の場合は二分探索 (lower_bound, upper_bound) を正しく書くこと自体が難しかったようです。

解説・懇親会

寿司やピザをみんなで囲みながら懇親会を行いました。

また懇親会の中で、コンテスト参加者やゼミメンバーから各問題の解説をしてもらいました。

普段のコンテストではあまり見かけないですが、関数型言語で洗練されたコードを書いた方などもいて、非常に興味深かったです。

まとめ

今回はAtCoderゼミとして初開催のイベントで不安な部分もありましたが、当日はそれなりに多くの方に参加していただき、楽しんでもらうことができ、非常に良いイベントとなりました。

AtCoderゼミでは、今後もこのようなイベントを社内外問わず開催していきたいと考えていますので、その際はぜひ参加していただけると幸いです。