競技プログラミング解法集:LeetCode・CSES・Codeforces を Python と C++ で網羅
bash ファイル名.sh を実行してください(中身を一度確認してから実行すると安心です)。
(macOS / Linux 環境が必要) 競技プログラミング解法集:LeetCode・CSES・Codeforces を Python と C++ で網羅
ひとことでいうと
このリポジトリ(ソースコードの置き場所)は、LeetCode・Codeforces・CSES といった競技プログラミングサイトの問題を、Python と C++ の両言語で解いたコード集です。自分で問題を解いた後に答え合わせをしたり、アルゴリズムの実装パターンを実際のコードで学んだりする教材として活用できます。VS Code(テキストエディタ)用の拡張機能「CPH」の設定もセットになっており、自分のパソコン上でテストをすぐに動かせる構成になっています。競技プログラミングを始めたばかりの人から、より効率的な練習環境を整えたい人まで幅広く使えるリソースです。
こんな人におすすめ
1. LeetCode や Codeforces を独学している人 自分で問題を解いた後、「他の人はどう書いているんだろう?」と気になることがあります。このリポジトリには Python と C++ の両方の解答例が揃っているため、言語ごとの書き方の違いを同じ問題で比べながら学ぶことができます。
2. CSES Problem Set(競技プログラマーが必ず通るとされる問題集)に取り組んでいる人 Movie Festival(映画祭スケジューリング)・Bracket Sequences(括弧の判定)・Counting Towers(塔の数え方)など、CSES の代表的な問題が多数収録されています。解き方に詰まったときの参考コードとして手元に置いておくと、学習がスムーズに進みます。
3. VS Code の CPH 拡張を使って効率よく練習したい人
CPH(Competitive Programming Helper)は、競技プログラミングのテストケースを自動管理・実行できる VS Code の拡張機能です。このリポジトリには CPH が使う .prob ファイル(テストケースを保存するファイル)が 20 件以上すでに含まれており、コードをダウンロードした直後からテスト実行環境を再現できます。
インストール・使い方
ターミナル(文字で命令を送る画面)を開いて、以下の手順を順番に進めてください。コマンドはコピー&ペーストで構いません。
Step 1: リポジトリをクローン(ダウンロード)する
git clone https://github.com/ishaanbuildsthings/leetcode.git
cd leetcode
git clone はインターネット上のコードを自分のパソコンにまるごとコピーするコマンドです。cd leetcode でダウンロードしたフォルダの中に移動します。
Step 2: Python が使えるか確認する
python3 --version
Python 3.x.x と表示されれば準備完了です。このリポジトリは Python 3.12 での動作が確認されています。
Step 3: Python のソリューションをそのまま実行してみる
# 括弧の判定(Bracket Sequences)を試す例
python3 -c "
s = '(())()'
stack = 0
for c in s:
if c == '(': stack += 1
elif c == ')':
if stack == 0: print('NO'); exit()
stack -= 1
print('YES' if stack == 0 else 'NO')
"
-c オプションに続けてコードを書くと、ファイルを作らずに Python をその場で実行できます。上の例では YES と表示されれば正解です。
Step 4: VS Code に CPH 拡張をインストールする
VS Code の拡張機能マーケットプレイスで「Competitive Programming Helper」と検索してインストールします。このフォルダを VS Code で開くと、.cph/ フォルダ内の .prob ファイルからテストケースが自動で読み込まれ、ボタン一つでテストを実行できるようになります。
Step 5: 付属の Web サイトを起動したい場合(任意)
cd site
npm install
npm run dev
npm install は Web サイトに必要なパッケージを一括でインストールするコマンドです。npm run dev でローカルサーバーが起動し、ブラウザで解法一覧ページを確認できます。
動かしてみた
Python 3.12.13 が利用できることを確認しました。.cph/ ディレクトリには 20 件以上の .prob ファイルが格納されており、ファイル名は {問題名}.py_{ハッシュ値}.prob という形式で統一されています。CPH 拡張が自動管理する命名規則に沿った構成で、クローン直後からテスト環境を再現できる状態です。
site/ ディレクトリには package.json・tsconfig.json・next.config.ts・prisma.config.ts が揃っており、Next.js + TypeScript + Prisma による Web アプリの環境が整っていることも確認できました。
収録されている問題(.prob ファイルより確認)には以下のようなものがあります。
- Moving Robots / Swap Game / Cherry Tree(C++ 版あり)
- Counting Towers / Movie Festival / Bracket Sequences I
- PolandBall and Gifts / Distinct Values Subarrays・Subsequences
- Ra-One Numbers / Point Location Test / Maximum Subarray Sum II
- Traffic Lights / Knight’s Tour / Sliding Window Xor / Little Elephant and T-Shirts
貪欲法・動的計画法・グラフ探索など、競技プログラミングで頻出のアルゴリズムパターンを幅広くカバーしている構成です。
ブラウザで試す(デモ)
Step 5 で npm run dev を実行してローカルサーバーを起動した後、ブラウザで http://localhost:3000 にアクセスすると Web サイトが表示されます。括弧列判定・映画祭スケジューリングなどの代表問題について、入力値を自分で変えながらアルゴリズムの挙動をインタラクティブに確認することができます。コードを書かずに動きを確かめたいときに便利な機能です。
実践のコツ:はじめの一歩
- まず 1 問を自分で解いてからコードを見る:答えを先に読むより、自分で考えた後に参照するほうが記憶に残りやすいです。
- Python と C++ を見比べる:同じ問題を両言語で読むと、書き方のクセや速度の違いを肌で感じられます。
- CPH の
.probファイルを積極的に活用する:VS Code と CPH 拡張を組み合わせれば、入力のコピー&ペーストなしにサンプルテストを自動実行できます。繰り返しのテストが格段に楽になります。 - Movie Festival(区間スケジューリング)から始める:貪欲法の入門として最適な問題です。終了時刻でソートして 1 つずつ選ぶだけのシンプルな実装で、アルゴリズムの基本的な考え方を学べます。
- Bracket Sequences でスタックに慣れる:スタック(積み上げて取り出すデータ構造)を使った短いコードで、O(n)(入力数に比例した計算量)の実装パターンを確認できます。
- Counting Towers で動的計画法(DP)に入門する:前計算でクエリを高速化するパターンが学べます。まず問題文を読み、解答コードと照らし合わせるだけで DP の流れが見えてきます。
活用アイデア
- アルゴリズム勉強会の題材として使う:Bracket Sequences・Movie Festival は入門〜中級者向けの典型問題です。チームで実装パターンを議論するときの具体例として活用できます。
- Python と C++ の学習を並行して進める:同一問題の両言語実装を比べることで、「C++ は配列操作が速い」「Python は可読性が高い」といった感覚を実際のコードで体感できます。
- 競技プログラミングの過去問レビューに使う:コンテスト後に自分の解法と見比べ、より効率的なアプローチを探す復習素材として使えます。
- 個人ポートフォリオの雛形として活用する:
site/の Next.js + Prisma 構成は、自分の解答を Web ページとして公開するテンプレートとしても流用できます。 - CSES Problem Set の攻略リストとして管理する:収録問題をチェックリスト代わりに使い、「この問題は解いた・まだ」と進捗を管理しながら学習を進められます。
- コーディング面接の準備に役立てる:LeetCode の問題も含まれているため、就職・転職活動でコーディング試験を控えている人が解法パターンを確認する用途にも向いています。
用語とポイント解説
CPH(Competitive Programming Helper) VS Code 用の拡張機能(プラグイン)で、競技プログラミングのテストを自動化するツールです。かんたんに言うと「問題のサンプル入力と正解出力を保存しておき、ボタン一つで全テストを走らせてくれる仕組み」です。手動でコピー&ペーストする手間が省け、実装に集中できます。このリポジトリには CPH 用の設定ファイルがすでに揃っています。
CSES(Code Submission Evaluation System) フィンランドのヘルシンキ大学が提供する競技プログラミング問題集です。かんたんに言うと「アルゴリズムの基礎を体系的に学ぶための練習問題サイト」です。貪欲法・動的計画法・グラフ理論など幅広いテーマが 300 問以上揃っており、世界中の競技プログラマーが通る登竜門的な存在として知られています。
貪欲法(Greedy Algorithm) 問題を解くとき、その場その場で「今いちばん良さそうな選択肢」を選び続けるアルゴリズムの手法です。かんたんに言うと「目先の最善手を積み重ねて全体の答えを出す方法」です。Movie Festival(映画を終了時刻順に並べて最大本数を選ぶ)がその典型例で、シンプルな実装で効率的に解けます。
動的計画法(DP: Dynamic Programming) 大きな問題を小さな部分問題に分割し、それぞれの答えを記録しながら解く手法です。かんたんに言うと「一度計算した結果を使い回して、同じ計算を繰り返さないようにする方法」です。Counting Towers のように「クエリが大量にくる問題」では、前計算によって大幅な高速化が実現できます。
スタック(Stack)
データを「積み重ねて、上から取り出す」構造のことです。かんたんに言うと「お皿の積み重ねと同じで、最後に置いたものを最初に取る仕組み」です。Bracket Sequences(括弧の判定)では、( が来たら積み上げ、) が来たら取り出すことで、括弧の対応を線形時間(O(n))で確認できます。
O(n)・O(n log n) 記法(計算量) アルゴリズムがどのくらいの速さで動くかを大まかに表す記号です。かんたんに言うと「入力の件数が増えたときに処理時間がどう増えるかの目安」です。O(n) は件数に比例、O(n log n) は「件数 × その対数」程度の時間がかかることを意味します。ソートを使う貪欲法のアルゴリズムでよく登場します。
Next.js
React(JavaScript の UI ライブラリ)をベースにしたフルスタック Web フレームワークです。かんたんに言うと「画面の見た目とデータ処理をまとめて作れる Web アプリ開発ツール」です。このリポジトリの site/ ディレクトリでは、競技プログラミングの解法を Web ページとして公開する仕組みに使われています。
Prisma TypeScript(JavaScript に型を加えた言語)向けの ORM(Object-Relational Mapper)です。かんたんに言うと「データベース(データの保存庫)を TypeScript のコードから操作しやすくするツール」です。SQL(データベース操作言語)を直接書かなくても、オブジェクト(データの塊)として読み書きできるため、コードの見通しが良くなります。
.prob ファイル
CPH 拡張が自動生成するテストケース定義ファイルで、JSON(データの記述形式の一つ)形式で保存されています。かんたんに言うと「問題のサンプル入力と正解出力をまとめたメモファイル」です。このファイルがあれば、VS Code 上でワンクリックしてすぐテストを走らせることができます。
アルゴリズムの学習は、実際に動くコードを読むことで一気に理解が深まります。このリポジトリは、ぜひ CSES Problem Set の自主学習や競技プログラミングの過去問復習、コーディング面接の準備などに活用してみてはいかがでしょうか。