社内プログラミングコンテスト(以下、社内プロコン)で1位を取るまでの具体的な勉強法をまとめてみました。
「これから競技プログラミングをはじめようとしている人」や「勉強しているのに思うように問題が解けない」の人に読んで頂ければ役に立つかなーと思います!
関連ブログ:社内プロコンで1位になるまでの道のり
はじめに:この記事における難易度の記載
私の会社では年に3回ほど社内プログラミングコンテストが開催されており、プログラミングサービスTOPSICを使用しています。また、TOPSICと似た問題がAtCoderという誰でも無料で使えるプログラミングサイトで提供されているので、その話も記事内に出てきます。
TOPSIC…企業向けのプログラミングサービス
AtCoder…個人が使えるプログラミングサービス
TOPSICとAtCoderでは難易度の標記が異なりますが、大体次のような感じです。C問題までを解ければ通常のエンジニアとしては十分、D問題以降を安定して解ける人は上場会社でも数人くらいと言われています。
AtCoderABC「A問題」 = TOPSIC「難易度1」 = 易しい
AtCoderABC「B問題」 = TOPSIC「難易度2」 = 易しい
AtCoderABC「C問題」 = TOPSIC「難易度3」 = 普通
AtCoderABC「D問題」 = TOPSIC「難易度4」 = やや難しい
AtCoderABC「E問題」 = TOPSIC「難易度5」 = 難しい
AtCoderABC「F問題」 = TOPSIC「難易度6」 = 難しい
参考:http://chokudai.hatenablog.com/entry/2019/02/11/155904
(ポイント1)目標を明確にする
「1位になる」、「10番以内に入る」なんでもいいですが目標は明確にしましょう。
何なら「次は負けませんから」、「1位になります」と社内で言いまくりましょう。
(ポイント2)目標・タスクの微修正
これに関してはプロコンの度に、少しずつ軌道修正しました。
私の場合は、以下のような感じで具体的な内容を少しずつ修正しました。
- 難易度1,2,3を確実に10分以内、できれば5分以内で解く
- 難易度4までをほぼ確実に解く
- 難易度4を5~10分で解く
大切なのは最終目標と今の自分の実力から逆算して都度できるようにすべきことを目標に設定することです。今日の目標と明日の目標は日々変化します。
(ポイント3)練習方法
難易度4くらいまでが出題されるプロコンで出てくるレベルの問題に関しては基本的にパターンマッチングです(この場合はこう解くんだよねえというような意味です)。
競技プログラミングサイトAtCoderの難易度ABCを埋めて解けない問題は、たぶん他の人も解けないので素直にあきらめましょう。解いたことがある問題の類題が出てきたら確実にAC(正解)できるようにした方が効率が良いです。
勉強にはAtCoderを利用し、進捗管理にはこちらを使いました。
https://kenkoooo.com/atcoder#/table/
https://github.com/kenkoooo/AtCoderProblems/
また、GASでAPIをたたいてスプレッドシートで管理していました。
テスト対策をする時は(プロコン対策に限らず)次の点を気にしています。
- 偶然の正答は(ほぼ)間違い
- 忘れていないか
- 何とかの忘却曲線的な何か(復習スパンの設定)
(ポイント4)具体的にどういう基準で練習するか
練習の時に偶然正解しても、本番で正解できるとは限りません。本番で解くための練習時の基準として「同じ問題を3回解けたら偶然ではない」としました。
さらに、TOPSIC(⇐社内プロコンのプログラミングサービス)は提出が1回のみで、間違えた場合の再提出は許されないので「3回連続正解できればOK」という少し厳しい基準を設定しました。
(ポイント5)進捗・正解率は客観的な指標で管理する
自分が得意だと思っていても意外と正解率が低い問題があったりします。進捗・正解率は、自身で正確に記録するか、サービス上の統計を拾うなどして必ず客観的な指標で管理しましょう。
主観での手応えと客観的な数値を突き合わせてギャップを抽出し、ギャップを埋めていくのが重要です。
勉強法まとめ
これらは基本的なことですが一番効率が良い勉強方法かと思います。
- 目標を明確にする
- 目標から逆算して
- 目標とタスクは進捗に合わせて修正する
最後までお読みくださり、ありがとうございました!
- カテゴリ:
- プログラミングコンテスト
- キーワード:
- プログラミングコンテスト
- 競技プログラミング