基本情報を持ってれば入茶できるからみんなAtCoder始めようぜ
2024年1月14日、AtCoder5ヶ月目にして入茶しましたので、自己紹介を兼ねて入茶記事を書きます。
対象読者
IT業界の業務系で働いていて、AtCoderをやるべきか悩んでいる人(ぜひやろう)
記事主のことを知りたい奇特な人
目次
普段なにしてる人?
競プロをやろうと思ったきっかけ
茶色までにやったこと
競プロ前からできていたこと
茶色までにできるようになったこと
まだできていないこと(緑までにやること)
印象深かったコンテスト
競プロをしてよかったこと
まとめ
おまけ
普段なにしてる人?
IT業界の末席で働いているプログラマです。零細SESという業界の闇の底で特定派遣として働いています。
普段はC#のWebアプリ中心に、Windows向けのJTC業務システムを保守改修しています。C#の他にVB.NET、php、Python、Ruby、Java、JavaScript、PowerShellなどなど無節操に触っています。ExcelVBAチョットデキル。
自認はバックエンド技術者ですが、実業務は保守プログラマ1人でなんでもやるのがデフォルトの現場ばかりなので両方書きます。フロントなら画面設計やAngular.js(旧)・React・Vue.js、バックエンド技術者がフロント書くときのお決まりセットJQuery+Bootstrapはもちろんやっています。バックエンドならDB設計やDDL作成もやりましたし、インデックス貼ったりView作ったりで速度改善したり、インフラならIIS設定したりVMWareでの仮想サーバーメンテナンスもやりました。
格好つけてフルスタックと呼んでますが、中途半端になんでもできる便利屋さんの立ち位置ですね。設計もデザインもパッケージ導入もやるので、実はプログラマではなくシステムエンジニアなのかもしれません。
競プロやろうと思ったきっかけ
派遣先からのパワハラで持病のうつをこじらせました。(さすがに派遣先は変えてもらいました。今は元気です。まだ睡眠薬飲まないと眠れないけどな!)
うつ状態悪化でコーディング以外のことがほぼできない状態だったので、少しでもコーディングして元気出そうと思ったのが競プロを始めたきっかけです。リハビリですね。
競プロなら市場調査や要件定義なしでコーディングできるのが良いですね。
中学生時代から趣味でHTML手打ち個人サイト運営してたオタクでしたが、今回の体調不良トラブルで「コーディングだけは眠れなくなっても食欲不振で体重が15kg落ちてもできる」と分かって我ながら驚きました。プログラマは天職だったんだな。
茶色までにやったこと
AtCoder Beginners Selection
コンテスト(バーチャル含)にとにかく出る
コンテスト中に検索しまくる
コンテスト後にTwitterでわいわい
自力AC後に解説を見る
典型90問の★2を少し
競プロで楽しいのはやはりコンテストなので、まずは楽しいを増やすのがベストと信じ、コンテスト参加とバーチャルコンテスト参加を主軸でやってます。
本番中に問題を解きながらガンガン検索し全力で学び、本番後に振り返りをします。実際の業務と似た流れですね。
自分の半分以下の年齢の子たちといいねを送り合って話すのは犯罪臭がしますね元気が出ますね。
競プロ前から既にできていたこと
基本情報レベルの数学知識(パリティ、n進数、log、総和、確率計算など)
VSCodeのローカル開発環境の構築
オーダー計算、ソートのオーダー理解
dfs/bfsアルゴリズムの概念理解(実装はできない)
二分探索の概念理解(実装は
ツリー構造の概念理解(実装は
有向グラフ・無向グラフの概念理解(実装は
Pythonを使ったWebサイト構築
茶色までにできるようになったこと
dfs/bfsコードの利用/改変(実装は)
累積和の理解・実装
尺取り、ランレングス圧縮などの用語で実装方法を伝えること
三分探索の概念理解
Python()
できるようになったことが少ない通り、ほぼ精進してません。初めて知ったのは累積和だけだと思います。(尺取りやランレングス圧縮は名前を知らなかっただけで自然に実装してた)
基本情報技術者試験の知識と一定のコーディング速度があれば、入茶はできます。
むしろPythonの基本構文を毎回検索してる()
※電子工学科出身なので少し基礎知識バイアスがかかってるかもしれません
できていないこと(緑までにやること)
dpの理解、ナップザック問題のような典型問題の理解
ツリー構造の実装・操作・応用
にぶたん実装・応用
dfs/bfs応用
printデバッグや定数デバッグをしたあとはちゃんと消してWAしない(ミスはツール設定して環境で防ごう)
bit全探索のような名前しか知らないパターンの概念理解(本番でアタリをつけてググるための事前準備として、どういう活用法ができるか調べる)
本番で解けなかった問題に必要なアルゴリズムの概念理解(同上)
体調管理
精進
印象深かったコンテスト
ABC317 C問題
まず入力例3がカントー地方マサラタウン出発なのに感動した。ゲーフリコンテストありがとう。
グラフの知識はあったが本番では手も足も出ず、解説を読む。
そこで「深さ優先探索」「隣接行列」のアルゴリズムと実際の問題とが繋がって、この瞬間に競プロにハマりました。
ARC165
このA問題が灰diffとか、競プロ界隈は化け物しかいないのか?????
ABC321
初めてC問題(しかも茶diff)が解けて茶パフォ。コードは汚い。
まよコン 2024/1/4
茶問題、にぶたん!と思って検索をしたら二分探索では解けず、二分探索の記事の中に三分探索というものを見つけ、凸関数/凹関数なら三分探索で解けると知りました。
にぶたんは単調増加/単調減少のときに使おう。
ABC334
成功すれば入茶!という回でなんと1完を記録。Aしか解けず灰色なのに冷える衝撃の回。
AD2完の人も多かった回ですが、典型の精進をしていなかった私はDも全く分からなかったです。
泣きながら風呂に入り、あたたかくして寝ました。
このC問題で靴下について悩みぬいて感想戦を漁ったおかげで、ABC336のD - Pyramidにて「左右からやる」を思いつき緑Diffを達成。
(本番でACしたコードは汚すぎたので、無駄処理を削ったものを掲載します)
上記のように、毎回のコンテストを本気で参加するだけで大きなスキル向上を見込めます。
やってよかったこと
テストケース(エッジケース)の意識が向上し、バグ発見が早くなった
実装が早く正確になった
計算量が少ない時は枝切りをしないほうが早いなど、計算量の感覚が身についた
家でコードが書けるので「コーディングできる仕事じゃないとヤダ!」や「仕事で使う言語これじゃないとヤダ!」の拘りがなくなり、仕事に精神的余裕が出た(特にExcel作業や手動テスト作業)
楽しみながら仕事に役立つのがメンタルに良い
茶色のような客観的評価があるのはメンタルに良い
まとめ
新しく覚えたことはmap(int, input().split())と累積和くらいで、振り返ると入茶までに全然精進していないことが分かりました。
基本情報相当の知識があるプログラマならそれだけで茶色までは戦える上に、普段業務で使っている言語をそのまま使えるので、勉強量も少なく参加できることが分かったので
ぜひプログラマたちには「学習コスト低く始められるよ!」と伝えて積極的に競プロを広めていきたいなと思いました。
これから緑までは灰最上位〜緑Diff下位までのB〜D問題を中心に解いて、典型知識の穴埋めをしようと思います。
おまけ
AtCoderをpaizaの親戚くらいに思っていた私は「せっかくだしTypeScriptの勉強に使おう」などとほざき、初回は使ったこともないTypeScriptで参加する舐めプをしていました。すぐに反省し、業務経験があり競プロ利用者の多いPythonのうち「JSと同じくJITコンパイルで高速に動作する」の特徴を持つことからPyPyに変更しました。
TypeScriptは「勉強のため〜」とかいってコンテスト系で使うと、ほぼJavaScriptで記述してしまい勉強にならないので、体系的に学習したほうが効率的ですね。
TypeScriptを新しく〜の話とは矛盾するのですが、私はIT技術者として「どの言語を学ぶか?」や「どの言語で書くか?」はあまり本質的ではないと思っていました。しかし最近、Rustという強い人しかいない言語が気になりつつあります。
「Rubyで募集かけるとつよつよエンジニアが厳選されて来るから採用が楽」なんて噂を聞いたり「限界VBチームが派生してそのままC#を書いたような保守困難プロジェクトに参加した」などで、言語によって得られる環境が違うなら……という思いが湧いています。
私、そもそも組込系とかの代替が難しいプログラマになって一生コードを書いていたかったんですよね。Rustはそのあたりの願いを叶えてくれそうな低レイヤーな高級言語らしいので気になっています。現在のJTC事務システムのキャリアから、この年齢でそちらへ舵を切れるのか分かりませんが……
この記事が気に入ったらサポートをしてみませんか?