初めまして!totosukiと申します。
先日ABC310にて入茶をしたので、記念に記事を投稿します!
はじめに
自己紹介
高校三年生のプログラミングと音ゲーが好きな人です。
ゲーム制作や機械学習をのんびりやってます。
最近、ラーメンを食べ過ぎていたので一ヶ月ラーメン禁止生活を送っていました。
競プロを初めたきっかけ
私は、競プロを始める前からTwitterアカウントを動かしていました。(@totosuki_)
時々、AtCoderをやっている人を見かけていて、興味があったので参加登録をしました。
これが競プロを初めたきっかけです。
.......そして、軽い気持ちで「AtCoder初参加する〜」みたいなツイートをしたら、何とchokudaiさんから引用リツイートが来まして
この手のツイート大体ネタなんだけど、ちょっとガチか判断つかなかったので。AGCむずいよ!気を付けてね!!!心折れないでね!!!!https://t.co/BMdSP5REA5
— chokudai(高橋 直大)🐙🔥@AtCoder社長 (@chokudai) May 21, 2023
間違えてAGCに参加してました......黒歴史ですね!!
結果は脅威の6ペナ0完でAGC062は幕を閉じました...
入茶するまでにしたこと
気を取り直して、入茶するまでにしたことをまとめていこうと思います。
私がしたことは大きく分けて3つです!!
ABCのA埋めをする
まず初めにA埋めとは、ABCのA問題を過去問を全てACするということです。
私は、競プロを始める前からPythonを少しだけ使っていて、条件分岐や全探索など、ある程度理解していましたが、A問題を埋める中で得られたものはいくつかありました!
- 基本的な入出力(
map(int, input().split())
などなど) - 三項演算子や内包表記
- ワンライナー関連の技術(
"YNEOS"[条件式]
みたいな(?????)) - A問題は絶対AC出来るという信頼
やっぱり一番下の「A問題は絶対にAC出来るという信頼」が大きいと思います。
なんかこう、基礎から着実に成長してる感じがするんですよね。
おすすめのA埋めの仕方は、飽きてきたらワンライナーやコードゴルフをすることです。
どうしても途中で飽きが来るので、コードゴルフなど色々遊びつつ埋めてました!
ABCのB埋めをする
A埋めも楽しかったし得られるものはありましたが、B埋めはその比にならないほど色々得られることがありました。
- 条件分岐や全探索への深い理解
- set型の使い方(集合演算やin演算子)
- 標準ライブラリ(itertools, collections等)の使い方
- 計算量の意識
- B問題は絶対AC出来るという信頼
- 自分流の変数名やコードの書き方の確立
「自分流の変数名やコードの書き方の確立」をある程度出来たのが大きいです。
レートを上げるにはB問題までの解く速度が少なからず影響してくるので、
「回数を数える変数名はcntにする」「多重ループを抜ける時はfor文のelseを使う」
の様に色々決めておくと、コードをどのように書くか考える時間を減らせると思います!
B埋めを始めた時は「基本全探索でやれば解けるでしょ!!」とか思ってましたが、
そもそも全探索の仕方を考えるのが難しい問題もあって、勉強になりましたね...
また、難し目のB問題ではTLEが時々出て、その頃から計算量を意識し始めました。
結局C問題以降では、計算量を意識することが重要になるので、B埋めの段階で意識し始めたのは良かったと思います。
基礎的なアルゴリズムの理解をする
実際に参加したコンテストで、アルゴリズムを知らなくて解けなかったC問題やD問題が多発したので、基礎的なアルゴリズムの理解をしました。
基礎的なアルゴリズムの理解をすることで、「解説文を読んでも解法が分からない」といった事がほとんど無くなると思います!解法を見ても理解できない時って辛いですよね...
もちろん、理解したアルゴリズムを身につけないとほぼ実践で使えないので、私もこれからは理解したアルゴリズムを身につけられる様に頑張ります!!
ここで私が、理解または身につけたアルゴリズム・データ構造などを列挙してみます。
-
全探索
必ず身につけていないとB問題でも解けない問題が出てしまうかなと思います。
B問題の過去問を沢山やることで身につくと思います(脳筋) -
set型
個人的に入茶する上でset型を身につける事が一番大切だと思います。
C問題ではset型を使って解く問題がとても多いです!! -
累積和
けんちょんさんの記事や後ほど紹介する鉄則本で学習しました。 -
いもす法
累積和を理解したらこっちも理解することが出来ました。 -
動的計画法
Educational DP Contestを解いたりして理解まではしました。
鉄則本を読んで身につけるとこまで持っていきたいです! -
deque(デック)
計算量の削減や幅優先探索、深さ優先探索で使うクラスです。
nkmkさんのサイトを参考にしながら使っています。 -
幅優先探索(BFS)
グラフ問題を解けるようになりたいので、少し理解しています。
深さ優先探索(DFS)は触れてすら無いです... -
Union-Find
最近はUnion-Findの学習もしています。これもnkmkさんのサイトを参考にしてます! -
整数問題系のアルゴリズム
様々な記事を参考にしながら整数問題系のアルゴリズムも少し学習しました。
具体的には「素数判定」「約数列挙」「素因数分解」などです。
また、「競技プログラミングの鉄則」(鉄則本)というE869210さんが執筆された本を購入しました。
C++以外にも、PythonとJavaの言語を使用した、本書中に出る解答のソースコードがGitHubに公開されているのが購入の決め手でした。
アルゴリズムの学習には、鉄則本を基本的にメインで使って、サイト検索等でより理解を深めるのが個人的にとてもおすすめです!
AtCoder Problems
現在のAC数やProgress Chartsです。良ければ参考にして下さい!
A埋めとB埋めをした事で、Longest Streakを繋げるためにC問題以上を解かなければならないので、そこそこ意味のあるLongest Streakになっていると思います。100日目指したい!
C問以降はあまりやれてないですね......
B問までの解く速度で入茶した部分が結構あると思います。
昔に少しだけA問題とB問題をやっていたので見にくいグラフになっています。
というか何故過去の私は2021年のクリスマスにAtCoderを初めたのでしょうか??
終わりに
入茶をすることが出来てとてもとても嬉しいです!!!!
次の目標は入緑です!年末までには達成したいなと考えています。
もし入緑したら、記事を書こうと考えているのでその際は読んでくれると凄く喜びます。
初めての記事で拙い文章ではありますが、少しでも役に立った方がいると嬉しいです!