AtCoder@Pythonを始めて2ヶ月が経ちました

はじめに

AtCoderを2ヶ月間解き、その成果を可視化するために、ブログに綴ります。本記事は下記記事の後続記事となります。

実績情報

2ヶ月間の実績情報を記載します。括弧内は1ヶ月目との差分になります。

概要

  • Rating:615 (+363 灰色⇒茶色)
  • Contest:8回(+5回)
  • Accept:425問(+98問)
  • Streak:56日(+31日)

詳細

f:id:KoyanagiHitoshi:20190225131329p:plain

f:id:KoyanagiHitoshi:20190225104003p:plain

f:id:KoyanagiHitoshi:20190225195756p:plain

f:id:KoyanagiHitoshi:20190225200121p:plain

f:id:KoyanagiHitoshi:20190225195857p:plain

やったこと / 得られたこと

2ヶ月目でやったことと得られたことは下記の通りです。

ARC‐A問題 / ABC‐C問題を完走

ARC‐A問題とABC‐C問題を完走しました。但し、ほぼすべての問題は初見では解けず、解答と他人の提出コードを参考にして解きました。その結果、これまで「分からない」「解けない」と認識していた問題を下記のように識別できるようになりました。

  • どのように解けばいいのか分からない(How)
  • どのように実装すればいいか分からない(How to)
  • 解き方と実装方法は分かるが、TLEになってしまう(How long)

上記の問題に対して「なぜ分からないのか」「なぜ解けないのか」「なぜTLEになってしまうのか」を分析するために、これまでに解いた問題を分類することにしました。

ABC‐A問題 / ABC‐B問題 / ABC‐C問題 / ARC‐A問題を分類

これまでに問題を解いた経験から問題の分類観点を定義し、問題を分類しました。その結果から下記を得ることができました。

  • 自分の得意な分野(正答率の高い分野)を知ることができた(得られたこと)
  • 自分の苦手な分野(正答率の低い分野)を知ることができた(課題①とする)

問題の分類観点と分類一覧は下記記事で整理しています。

AtCoderにおける学習方法の考察

上記では問題に対して課題抽出のアプローチを行ってきましたが、そもそも論として「1ヶ月目に方針を立てた学習方法に課題があるのではないか」という仮説を立て、学習方法に対しても課題抽出するアプローチを取りました。学習方法を再掲します。

  1. 問題を読み、難易度に応じて、制限時間を設定する
  2. 処理方法と計算量(オーダー)を検討する
  3. 実装 / 入出力例でテストし、提出する
  4. TLE / WA の場合、制限時間まで粘る
  5. AC / 制限時間を超えた後は、すべての提出の中でACしているコード長が短いコードから20コード分(AtCoderで表示される1ページ分)で学習する

学習方法の結果として、2ヶ月間のコンテスト実績情報を記載します。私はコンテスト実績情報を表で管理しており、情報に応じて色をつけて可視化しています。[n=問題数]

  • A問題の正答率:100% [n=8]
  • B問題の正答率:100% [n=8]
  • C問題の正答率:40% [n=5]
  • A問題の解答時間:平均値 約3分54秒、中央値 約2分42秒 [n=8]
  • B問題の解答時間:平均値 約20分2秒、中央値 約13分8秒 [n=8]
  • C問題の解答時間:平均値 約27分22秒、中央値 約27分22秒 [n=2]

f:id:KoyanagiHitoshi:20190225114955p:plain

学習方法の結果から得られた課題は下記です。

  • 問題は解けるようになったが、速く問題を解くことができない
    ⇒ 問題を解く速度が遅い(相対的主観)
  • C問題がTLEになってしまう
    ⇒ 苦手分野と認識しました

一方、下記のようなことも得ることができました。

  • 短いコードで実装できるようになった
    ⇒ コンテストでコード長昇順の上位に入るようになりました
  • 実装方式、処理方法のバリデーションを学ぶことができた
    ⇒ 上記については分類一覧に反映しています

以上より、上述した学習方法を実施することで下記のことが分かりました(個人実施結果)。

  • 実装方式、処理方式のバリデーションを学ぶことができる(得られたこと)
  • 短いコードで実装できるようになる(得られたこと)
  • 苦手な分野が顕在化する(課題①と同義)
  • 速く問題を解くことができるようになるわけではない(課題②とする)

課題定義

以上から、現在における私の課題は下記2つとなります。

  • 課題①:苦手な問題分野が存在する(私の苦手分野については言及しません)
  • 課題②:解答速度が遅い

本来であれば、目標(ToBe)を設定し、現在(AsIs)と比較した時に課題(Gap)を抽出しますが、AtCoderを始めて2ヶ月目で現在の自分を認識できるようになったため、目標を立てることにしました。

目標設定

目標を設定するために、chokudaiさんのブログを参考にしました。chokudaiさんのブログから「私に必要な能力」「私のあるべき姿」という観点でブログを拝見しました。

水色 (Bランク R1200~1599 上位15%)

水色はかなり優秀です。普通に企業とかで超優秀って言ってるプログラマが居た時に、半分くらいはこのランクになると思います。数学が得意なタイプだと、この一つの上の青色に行きますが。

半数以上のIT企業において、アルゴリズム能力についてはカンストと言えるでしょう。特にアルゴリズム的な能力を必要としない会社であれば、ここから上はレートを上げても実務に役立つ部分はほとんどありません。

上記の下線部が「私に必要な能力」「私のあるべき姿」と思っています。そのため、下記2つの目標を設定しました。

  • 目標①:水色になる
  • 目標②:AtCoderを始めて6ヶ月間で成果を出す(残り4ヶ月間)
    ⇒ 個人的なスケジュールで6ヶ月間と設定しています。

3ヶ月目に向けて

学習方法

「目標①:水色になる」を実現するためには、水色以上のパフォーマンスを出す必要があります。そのため、コンテストのランキング一覧から水色以上のパフォーマンスを出す方法について調査した結果、下記2つの方針が立ちました。

  • 方針①:ABC‐A問題 / B問題 / C問題 / D問題をコンテスト時間内に全完する
  • 方針②:ABC‐A問題 / B問題 / C問題を20分以内で3完する

「方針①」については、これまでの学習方法を継続し、ABC‐D問題に取り組むことによって、目標を達成することができると思われます。「方針②」については、解答速度を上げることが考えられ、「課題①:解答速度が遅い」を解決することが考えられます。しかし、解答速度を上げることは「課題②:苦手な問題分野が存在する」を解決することが必要条件となってきます。そのため、優先度としてまずは「課題②:苦手な問題分野が存在する」を解決することに決めました。

精進方法

上記の学習方法を踏まえて、3ヶ月目の精進方法は下記2つを実施します。

  • 精進方法①(方針①の対応策):1日ABC‐D問題を1ACする
  • 精進方法②(方針②の対応策):1日ABC‐C問題を1ACする(苦手分野を中心に復習する)

ABC‐D問題は72問あるため(解くのに72日間かかるため)、今後3ヶ月間はD問題を解き、その後1ヶ月間でD問題の復習をする予定です。そのため、「目標②:AtCoderを始めて6ヶ月間で成果を出す」が実現できると思っています。詳細は3ヶ月目以降の振り返りで言及する予定です。

進捗報告

AtCoderを始めてから毎日(一時中断した時期もありましたが) Twitter で進捗報告をしています。私の精進ペースと精進量を見て、躍起になっている方や焦っている方がいるようですが、個人的な意見として、マイペースに進めることによってコスト(学習時間)に見合ったパフォーマンス(結果)が出ると思っています。私はStreakを続けることと問題量をこなすことでモチベーションを保っています。そのため、無理に人に合わせなくても良いと思っています。

最後に

2ヶ月目を振り返りました。1ヶ月目に比べて、自分のできることとできないことが明確になり、目標を立てることができました。さらに、方針(学習方法/精進方法)を決めることができ、あとは愚直にコツコツと学習を進めるだけです。

また、最近「AtCoderを始めました」「社会人で競プロを始めました」という方が散見されます。そんな方達と一緒に精進できれば良いかと思います。

編集履歴

  • 2019年2月25日(月)記事公開
  • 2019年2月26日(火)分類観点の定義と分類一覧(サンプルコードと解答例)記事へのリンクを追加

 

プロジェクトマネージャ試験を80時間で合格してみる

はじめに

2019年春期に行われるIPA情報処理推進機構)のPM試験(プロジェクトマネージャ試験)を受けます。合格するために計画(一部実績)を綴ります。

自己紹介

試験情報インプット / 計画策定

計画を立てるためにIPAの試験要項、シラバス、過去問題、また合格者実績情報を参照しました。試験要項とシラバスに関しては、午後2の論文対策としてPMに求められる知識・技能という観点で、過去問題と合格者実績情報に関しては、学習量という観点でインプットをしました。

試験情報インプット

試験要項

下記の試験要項ページにリンクが貼られている試験要項からPMに関する項目(試験の対象者像と出題範囲)をインプットしました。

試験の対象者像

  • 対象者像
  • 業務と役割
  • 期待する技術水準

出題範囲

  • 1 プロジェクトの立ち上げ・計画に関すること
  • 2 プロジェクトの実行・管理に関すること
  • 3 プロジェクトの終結に関すること
シラバス

下記のシラバスページにリンクが貼られているシラバスの資料をすべてインプットしました。

項目

  • 1 プロジェクト立ち上げ
  • 2 プロジェクトの計画
  • 3 プロジェクトの実行と管理
  • 4 変更の管理
  • 5 プロジェクトの終結と評価
過去問題

過去問題はPM試験の最新3年間分をインプットしました。

合格者実績情報

下記のサイトを参考にさせて頂きました。

計画策定

次章以降に計画として対策学習を記載します。また、効率良く(限られた時間の中で)学習するために、学習時間を設定しました。

対策学習

午前1

午前2

午後1

午後2

  • 論文方針設計(論文のテーマを2つ作成する)
  • 論文基本設計(各テーマに対応する章節項を作成する)
  • 論文詳細設計(章節項に対応する文章を作成する)
  • 論文試験(過去問題で文章のバリデーション試験、論文構造試験をする)
  • 最新過去問題1年分の解答・復習(実際に時間を計測し、最低文字数を書く)

学習時間 (80時間)

学習時間の見積もりは下記の通りです。

試験情報インプット / 計画策定(12時間)

試験情報インプットと計画策定に関しては実績時間となります。

試験情報インプット(7時間)
  • 試験要項:1時間
  • シラバス:2時間
  • 過去問題:2時間
  • 合格者情報:2時間
計画策定(5時間)
  • 計画策定:3時間
  • ブログ作成:2時間

対策学習(68時間)

対策学習に関しては予定時間となります。

午前2(10時間)
  • 2時間(試験時間40分 × 3倍) / 1年間分 × 5年間 = 10時間
午後1(23時間)
  • 4時間30分(試験時間90分 × 3倍) / 1年間分 × 5年間 ≒ 23時間
午後2(35時間)
  • 論文方針設計:4時間
  • 論文基本設計:4時間
  • 論文詳細設計:4時間
  • 論文試験 + 試験予備時間:12時間 + 7時間 = 19時間
  • 最新過去問題1年間解答・復習:2時間 × 2倍 = 4時間

最後に

対策学習の実績時間に関しては対策学習実施後に、試験の合否に関しては合格発表後にブログ記載を予定しています。進捗については Twitter で呟いています。

編集履歴 

  • 2019年1月29日(火)ブログ作成

AtCoder@Pythonを始めて1ヶ月が経ちました

はじめに

AtCoderを1ヶ月間解き、その成果を可視化するために、ブログに綴ります。

自己紹介

  • SE 5年目(業務でプログラミングはほぼしません。稀にPoCでやる程度です。)
  • 情報系大学院卒
  • 2019年1月からAtCoderを開始

実績情報

1ヶ月間の実績情報を記載します。

概要

  • Rating:252(灰色)
  • Contest:3回
  • Accept:327問
  • Streak:25日

詳細

f:id:KoyanagiHitoshi:20190125205442p:plain

f:id:KoyanagiHitoshi:20190125205530p:plain

f:id:KoyanagiHitoshi:20190125211411p:plain
f:id:KoyanagiHitoshi:20190125210908p:plain

f:id:KoyanagiHitoshi:20190125211818p:plain


やったこと / 得られたこと

ABC‐A問題を完走

A問題を解き始めた当初は入力処理と出力処理のバリデーション(1行C列、R行1列、R行C列)に対応することができず、苦戦しました。ただ、型を覚えればA問題を素早く解けるようになりました。

ABC‐A問題から得られたこと

実装方式

アルゴリズム / 方法論

ABC‐B問題を完走

B問題は扱うデータ数やデータ構造がA問題よりも複雑かつ多くなりました。具体的には、グリッドや2次元表現の問題があり、あまり実装したことがない集合処理や行列処理をする必要がありました。

ABC‐B問題から得られたこと

実装方式

アルゴリズム / 方法論

ABC‐C問題 / ARC‐A問題を走行中

C問題から一気に問題の難易度が上がりました。C問題こそ競プロをしているという感じが出ています。C問題を解いていてB問題までを振り返ると、B問題までがPythonの実装方式と数学の基本的な考え方をやっていたと実感しています。現在、ABC‐C問題を一巡し、ARC‐A問題を埋めています。

実装方式

アルゴリズム / 方法論

AtCoderにおける学習方法

AtCoderを始めて、学習の仕方にかなり試行錯誤しました。結論として下記のようなプロセスで現在学習を進めています。

  1. 問題を読み、難易度に応じて、制限時間を設定する
  2. 処理方法と計算量(オーダー)を検討する
  3. 実装 / 入出力例でテストし、提出する
  4. TLE / WA の場合、制限時間まで粘る
  5. AC / 制限時間を超えた後は、すべての提出の中でACしているコード長が短いコードから20コード分(AtCoderで表示される1ページ分)で学習する

上述のページを見ていると、可読性に拘らず(改行や半角スペースすらせず)、短いコードを出したいというユーザの意図が見えます。このような方のコードからは洗練されたコード(素早く短く書くコード)を学べるため、とても参考になります。

特に私はAtCoderを始めた頃にABC‐A問題とABC‐B問題でかなり躓いていたので(C問題も躓いていますが)、短く書くコードを5の方法で学びました。学習の方法論はたくさんあると思うので、おすすめの学習方法があれば教えてください。

最後に

AtCoder@Pythonを始めて1ヶ月経ちましたが、上記のようなことが得られました。得られた事は下記のQiitaに技術メモとしてまとめていますが、あまり整理できていないので、これを機会に整理していきたいと思っています。

後続記事

編集履歴

  • 2019年1月26日(土)記事公開
  • 2019年1月26日(土)ABC‐A問題とABC‐B問題にAtCoderの問題リンクを追加
  • 2019年1月28日(月)ABC‐C問題にAtCoderの問題リンクを追加
  • 2019年2月25日(月)後続記事を追加