「来月からコーディングテストのある選考が始まるのに、何も準備できていない」。転職活動を進める中で、こうした焦りを感じたことがある人は多いだろう。コーディングテストは一夜漬けでどうにかなるものではないが、かといって半年も準備期間を取れるとは限らない。仕事をしながらの転職活動であれば、限られた時間の中で効率的に対策を進める必要がある。
この記事では、コーディングテスト対策を1ヶ月という現実的な期間で仕上げるための具体的なスケジュールを提案する。週ごとの学習目標を設定し、どのトピックにどれだけの時間を配分すべきかを明確にしている。もちろん、全員が同じスタートラインではないので、自分の現在の実力に合わせて調整してほしい。このスケジュールは「基礎的なプログラミングはできるが、アルゴリズムの問題演習はあまりやったことがない」という人を想定して作っている。
1ヶ月のスケジュール全体像
1ヶ月を4週間に分けて、それぞれの週にテーマを設定する。全体の流れとしては、基礎固めから始めて徐々に応用的なトピックへ進み、最終週で模擬テスト形式の総復習を行うという構成だ。この順序には理由があって、前の週で学んだ内容が次の週の土台になるように設計している。
平日は仕事があることを前提に、1日の学習時間は平日1~2時間、休日3~4時間を目安にしている。1ヶ月の合計で約60~80時間の学習量になる計算だ。この時間配分であれば、仕事に支障をきたさずに取り組める範囲だろう。もちろん、有給休暇を使って集中的に取り組める期間があれば、さらに深い理解が得られる。
ところで、スケジュール通りに進まないことを前提に「バッファ日」を各週に1日ずつ設けている点もポイントだ。理解が追いつかなかったトピックを復習する日、体調不良や残業で学習時間が取れなかった日の埋め合わせとして使おう。計画を立てても計画通りにいかないのが普通なので、最初から余裕を持たせておくことが完走のコツだ。
Week 1:基礎固め(配列・文字列・ハッシュマップ)
最初の1週間は、コーディングテストで最も頻出する基本データ構造の操作に集中する。配列の操作、文字列の処理、ハッシュマップの活用は、あらゆるアルゴリズム問題の土台になるテーマだ。ここをしっかり固めておかないと、後の週で扱う応用的な問題に太刀打ちできない。
配列の問題では、要素の走査、フィルタリング、累積和、Two Pointersといった基本テクニックを身につけよう。LeetCodeでいえばEasyレベルの問題を毎日2~3問解くペースが理想だ。特にTwo Sum(LeetCode 1)は面接問題の大定番なので、複数の解法(ブルートフォース、ハッシュマップ)で解けるようにしておきたい。配列のソートに関連する問題も何問か解いておくと、Week 2以降の学習がスムーズになる。
文字列の問題では、パリンドローム判定、アナグラム判定、文字の出現頻度カウントといったテーマが頻出だ。文字列操作はプログラミング言語ごとにAPIが異なるので、自分が面接で使う言語の文字列操作メソッドを一通り確認しておこう。ハッシュマップについては、「ある値の存在チェック」や「出現回数のカウント」といった基本的な使い方を問題を通じて体に覚え込ませる。ハッシュマップが自在に使えるようになると、多くの問題で計算量をO(n)に改善できるので、ここは時間をかける価値がある。
Week 1の目標は「Easy問題を見たら、10分以内に解法の方針が立つ状態」に到達することだ。解法が思いつかなくても焦る必要はなく、15分考えてわからなければ解説を読み、翌日に同じ問題を自力で解き直すというサイクルを回せばよい。
Week 2:探索アルゴリズムと木構造
2週目は、BFS(幅優先探索)、DFS(深さ優先探索)、そして二分木の操作に集中する。グラフ探索はコーディングテストの頻出テーマであり、この週で基本をしっかり固めておくと、Week 3のグラフ問題にスムーズに移行できる。
二分木の操作は、再帰の理解を深めるのに最適なテーマだ。二分木の高さ、ノードの合計値、左右の反転といったシンプルな問題から始めて、再帰関数の書き方と「ベースケース→再帰ケース」という思考パターンを身につけよう。LeetCode 104(Maximum Depth of Binary Tree)やLeetCode 226(Invert Binary Tree)は、5分以内に解けるくらいまで繰り返し練習してほしい。こうした基本問題がスラスラ解ける状態を作っておくと、応用問題での思考に余裕が生まれる。
BFSとDFSについては、二分木のレベルオーダートラバーサルでBFSを、前順・中順・後順の走査でDFSを学ぶのが自然な流れだ。BFSではキューの使い方、DFSではスタックまたは再帰の使い方をそれぞれ確認しよう。その後、二分木だけでなくグリッド(2次元配列)上でのBFS/DFSにも取り組む。LeetCode 200(Number of Islands)は、グリッドDFSの入門として必ず解いておきたい一問だ。
この週のもうひとつの重要テーマが二分探索だ。ソート済み配列から値を探す基本的な二分探索を実装できるようにした上で、「条件を満たす最小値・最大値を求める」タイプの応用問題にも挑戦しておこう。二分探索は境界条件の処理でバグが出やすいので、小さな入力で手動トレースする練習を丁寧にやっておくと本番で助かる。
Week 3:動的計画法(DP)とグラフ
3週目は、多くの人が苦手意識を持つDPとグラフ問題に取り組む。これらのトピックはコーディングテストのMediumからHardレベルで頻出するため、避けて通ることはできない。ただし、1週間ですべてをマスターするのは現実的ではないので、頻出パターンに絞って効率的に学ぼう。
DPの学習は、1次元DPの基本問題からスタートする。Climbing Stairs(LeetCode 70)、House Robber(LeetCode 198)、Coin Change(LeetCode 322)は、DP入門の三本柱と言ってもいい問題だ。これらの問題を通じて「状態の定義」と「遷移式の設計」という2つのステップを叩き込む。DPの問題を見たときに「dp[i]は何を表すか」をまず決められるようになれば、半分は解けたも同然だ。1次元DPに慣れたら、Longest Common Subsequence(LeetCode 1143)のような2次元DPの問題にも手を伸ばしてみよう。
グラフ問題では、隣接リストの構築方法、BFS/DFSによるグラフ走査、サイクル検出、トポロジカルソートが主要テーマだ。グラフの問題は「入力からグラフを構築する」ステップと「グラフ上で探索する」ステップに分かれるので、それぞれのステップを独立して練習するのが効率的だ。Course Schedule(LeetCode 207)はグラフとトポロジカルソートの代表問題で、コーディングテストでも類似問題がよく出題される。
実は、この週が精神的に最もつらい時期になりやすい。DPが理解できなくてモチベーションが落ちたり、グラフ問題の複雑さに圧倒されたりすることがある。そういうときは、無理にHard問題に取り組むよりも、Easy~Mediumの問題を確実に解ける状態を維持することを優先しよう。面接で出題されるコーディングテストの多くはMediumレベルなので、Mediumを安定して解ける実力があれば十分に戦える。
Week 4:模擬テストと総復習
最終週は新しいトピックの学習を控えて、模擬テストと弱点の補強に充てる。ここまでの3週間で学んだ内容を実戦形式で試し、本番に向けた調整を行う期間だ。
模擬テストの方法としては、LeetCodeのコンテスト(Weekly ContestやBiweekly Contest)に参加するのが最も実戦に近い形式だ。制限時間90分で4問を解くフォーマットで、問題は易しい順に並んでいるため、2問目まで確実に解けることを目標にしよう。コンテストの時間が合わない場合は、LeetCodeのMedium問題を3問選んで45分の制限時間を設定し、セルフ模擬テストを行う方法もある。模擬テストでは「解けなかった問題」よりも「時間内に解けたがバグがあった問題」の振り返りが重要だ。
模擬テストの合間に、Week 1~3で解けなかった問題の再挑戦を行う。過去に解けなかった問題のリストを作っておき、もう一度自力で解けるかどうかを確認しよう。2回目で解ければその問題は定着したと判断してよいが、2回目でも解けない場合はパターンの理解が不足している可能性がある。その場合は、問題そのものよりもパターン(DPの遷移式の立て方、BFSのテンプレートなど)の復習に時間を使おう。
模擬テストを通じて、自分の解答速度と正確性のバランスも確認しておきたい。面接のコーディングテストでは、完璧な解を時間オーバーで提出できないよりも、少し効率が落ちてもバグのないコードを時間内に書き切る方が評価される場合が多い。Mediumの問題を20~25分で解けるペースが目安だ。
日々の学習時間の配分と習慣化のコツ
限られた時間を有効に使うには、毎日の学習ルーティンを決めておくことが大切だ。おすすめのパターンとしては、朝の出勤前に30分間、Easy問題を1問解いてウォームアップする。夜は1~1.5時間をMedium問題や新しいトピックの学習に充てる。週末はまとまった時間を取って、難しめの問題やコンテスト形式の練習に取り組むという流れだ。
実は、学習効率を大きく左右するのが「振り返りの質」だ。問題を解いた後に、自分のコードと模範解答を比較して差分を分析する時間を取ると、同じ問題数をこなしても得られるものが全然違う。「なぜ自分はこのアプローチを思いつかなかったのか」「このデータ構造を使えば計算量がこう改善されるのか」といった気づきをメモに残しておくと、似た問題に出会ったときに引き出せるようになる。
学習を1ヶ月間継続するには、モチベーション管理も欠かせない。人間の意志力には限りがあるので、毎日「やるかやらないかを判断する」プロセス自体をなくすのが効果的だ。「朝起きたらまずLeetCodeを1問解く」と決めてしまえば、判断のコストがゼロになる。学習記録をつけて可視化するのも続けるコツで、解いた問題数がグラフになって増えていくのを見ると、達成感が得られて自然と続けたくなる。
それでも、どうしてもやる気が出ない日はある。そういう日は、無理に新しい問題に取り組まなくてもいい。過去に解いた問題の解法を見直したり、アルゴリズムの解説動画を見たりするだけでも、知識の定着には効果がある。大切なのは「ゼロの日を作らない」ことであって、毎日全力で取り組むことではない。
学習プランのカスタマイズ方法
この1ヶ月スケジュールは、あくまで標準的なモデルプランだ。自分の現在のレベルや応募先企業の出題傾向に合わせて調整することで、さらに効果的な対策ができる。
すでに基礎がある程度固まっている人は、Week 1を2~3日に圧縮して、その分のWeek 3を手厚くするとよい。逆に、プログラミング自体にブランクがある人は、Week 1の前に「Week 0」として基本文法とデータ構造の復習期間を1週間設けることをおすすめする。応募先企業がSQLやシステムデザインの問題も出すことがわかっている場合は、Week 4の一部をそちらの対策に振り分けるのも合理的だ。
企業ごとの出題傾向を調べるには、GlassdoorやLeetCodeのCompanyタグが参考になる。特定の企業でよく出る問題タイプがわかれば、そこに学習リソースを集中投下できるので、限られた時間をより有効に使える。転職エージェントを利用している場合は、担当者に過去の出題傾向を聞いてみるのも有効な方法だ。
まとめ
コーディングテスト対策を1ヶ月で仕上げるには、漫然と問題を解くのではなく、週単位でテーマを設定し、段階的にスキルを積み上げていく計画的なアプローチが欠かせない。Week 1で配列・文字列・ハッシュマップの基礎を固め、Week 2で探索と木構造、Week 3でDPとグラフに取り組み、Week 4で模擬テストと総復習を行う。
日々の学習は平日1~2時間、休日3~4時間を目安にして、問題を解いた後の振り返りに丁寧に時間をかけることが上達の鍵だ。完璧を目指すよりも、Mediumレベルの問題を安定して解けるようになることを目標にして、地道に1ヶ月を走り切ってほしい。