パンの木を植えて

主として数学の話をするブログ

AtCoderに挫折した初心者はLeetCodeを試してほしい

\[ %%% 黒板太字 %%% \newcommand{\A}{\mathbb{A}} %アフィン空間 \newcommand{\C}{\mathbb{C}} %複素数 \newcommand{\F}{\mathbb{F}} %有限体 \newcommand{\N}{\mathbb{N}} %自然数 \newcommand{\Q}{\mathbb{Q}} %有理数 \newcommand{\R}{\mathbb{R}} %実数 \newcommand{\Z}{\mathbb{Z}} %整数 %%% 2項演算 %%% \newcommand{\f}[2]{ \frac{#1}{#2} } \]

タイトル通りの記事です.

LeetCode というプラットフォームがあるんですけど,それが競技プログラミングへの入門として結構優秀だと思うからやってみてねという記事です.

競技プログラミングのガチ勢はこの記事の対象読者ではないです.真剣に競技として競技プログラミングを楽しまれたい方は,静かにブラウザバックしてください.

LeetCode とは何か

leetcode.com

GoogleAmazon などの外資IT大手は,面接時に coding interview というのがあります.これは面接官とコミュニケーションをとりながら,与えられたタスクをこなすようなコードを書くという形式の面接試験なのですけど,その対策をするためのサイトです.

したがって厳密には「競技プログラミングというゲームを楽しんでもらう」ためのサイトであるAtCoderとはジャンルが違うのですけど,LeetCode も AtCoder 同様に

  • 毎週コンテストを開催してそのレートを付けてくれる
  • 全世界で数万人以上のオーダーのユーザがいる
  • アルゴリズムとデータ構造についての知識を問う問題が出題される

という条件を満たしているので,競技プログラミングのプラットフォームとして扱うことができます.(これは私のオリジナルではなくて,実際海外の記事だとよく AtCoder と LeetCode が programming challenge website として同列に語られていたりします)

そして,これは私の意見ですが,日本では競技プログラミングサイトのシェアはAtCoder が圧倒的とはいえ,AtCoder で挫折した人には LeetCode はオススメなんですよ.


私は AtCoder のアンチではないです

上記の「LeetCode おすすめ」という意見について詳しく説明する前に一言断っておきますが,私は AtCoder のアンチではありません.AtCoder は素晴らしいサービスだと思います.

私はあくまで「競技プログラミングをやろうと思ってAtCoder を始めてみたけど,継続するのがしんどくてやめてしまった」人に対して,LeetCode 良いよと言いたいだけでありまして,AtCoder が良くないとは言ってません.やめるべきだとも思いません.


LeetCode がオススメな理由

お勧めする理由は,単純に「より継続しやすい」からです.初心者が競技プログラミングをやめてしまう理由は,要領がつかめてきて楽しくなる前に,継続できなくなってやめてしまうことだと思うのです.だから 初心者ほど LeetCode みたいなサイトでまず感じをつかむのが良いと思います.

以下,AtCoder との比較で LeetCode の方が「初心者が継続しやすい」と考える理由を挙げていきます.

過去問を解く機能が公式でサポートされている

競技プログラミングで上達するには過去問を解くのが不可欠ですが,LeetCode ではコンテストに参加する以外にも過去問を解くということが機能としてサポートされていまして,

  • 過去問を解いた数が難易度別に記録されて,
  • コンテストのランキングとは別に「過去問を解いた数のランキング」も用意されています

画面としてはこんな感じで,プロフィールから確認できます.(私のプロフィールなのでHardを全然解いてません)

難易度が Easy / Medium / Hard の3種類に分かれていて,全部で222問の問題を解いてきたことがわかります.

その右にある Beats という数字が順位を表しています.Beats というのは「勝つ」という意味なので,数字が大きいほど順位が上です.この画面では,難易度別に順位を出してくれています.


問題を解き始める前に標準入力を受け取らなくていい

AtCoder に限らず coding challenge 系のサイトは基本的に「標準入力を受け取って,標準出力に答えを返す」形式です.しかし標準入力をそのまま処理することはできないので,毎回「標準入力を受け取って変数に詰めるコード」を書く必要があります.

LeetCodeではこの必要がありません.初めから変数に必要なデータが格納されていて,ユーザが行うのは特定の関数を実装することだけです.

実際の過去問回答画面はこんな感じ.

findMedianSortedArrays という未実装の関数を実装すればよくて,標準入力に関わるボイラープレートは存在しません.


頑張ってるとバッジをくれる

コンテスト外の勉強,いわゆる「精進」に対して公式からご褒美が設定されています.

  • まず単にログインしているだけでポイントがもらえる,ログインボーナスがあります
  • 毎日,日替わりで問題が出題されます.その問題をある月に関して全部その日のうちに解き切ると,バッジがもらえます
  • 毎年,新年を迎えたときにその年のログイン状況に応じてバッジがもらえます
  • Study Plan という「初心者は迷ったらこれ解いとけ」な問題集が公式で用意されていて,解き切るとやはりバッジがもらえます

ちなみに結構バッジをもらうのは大変で,私が今持ってるバッジは「一年に50ログイン」だけです.

ゲーミフィケーションがちゃんとしているなあと思います.


毎週同じ時間に同じコンテストがある

AtCoder ってたまに同じ曜日の同じ時間に別のコンテストやってたりしますよね……?一度それで痛い目にあったことがあります.

予定をちゃんと見てれば済む話だとは思いますし,私が悪いんですけど,毎回真剣にコンテストの開催予定を読まなくて済む方が片手間に参加してる身としてはありがたかったりします.

LeetCode は weekly contest の開催日時が固定なので,その点安心です.何も考えずに予定を入れちゃってOKです.


まとめ

他にも全体的なUIの良さとか説明すべきだったかもしれませんけど,とりあえず競技プログラミングライフに影響しそうなのはこんな感じです.

私の個人的オススメとしてLeetCodeを紹介しましたが,競技プログラミングのプラットフォームってほかにもたくさんあるので良かったら調べてみてください.FreeCodeCampさまが記事を出してくれてます.

www.freecodecamp.org

あと,職探しで使おうと思ってるひとはAtCoderとかPaizaとか,日本で知名度があるものを使うのが無難だと思いますよ!!