PaizaでAランクを達成するまでにやったこと。
先日からちょいちょいまとまった時間ができたので、エンジニア転職サイトのPaizaさんでプログラミングの勉強をしていた。
このサイトではスキルチェックとして
ユーザごとスキルのランクが設定される
プログラミング問題が各ランク用意されていて、自分のランクより上のランクの問題を解く(採点で一定基準を満たす)とランクアップ
というサービスが提供されている。
自分の履歴を見ると2015年くらい、まだ学生の時にちょこちょこやっていたようだが当時プログラミングが苦手でBランクで止まっていた。
今回めでたくAランクに昇格したのでそれまでにやったことを3つ書く。
ところで僕はpython3使ってます。
1.基本的なアルゴリズムの確認
Bランク以下と比べて、Aランクの問題は問題解決のためのアルゴリズムの手札を持っていることを前提としている問題が多い。
例えばN * Mのマスを迷路に見立てて条件を満たす回答を得るとか。
*ネタバレに配慮すると変な書き方になった。
自分はこの部分が結構甘く、アルゴリズムのロジックを説明することはできるけどいざ実装しようとすると問題設定の他の条件をうまく組み込めない、という感じだった。
というわけで、まずは人の実装を見て細かくアルゴリズムの動作を追っていくことをした。
例えば幅優先探索だとキューを使う実装が定番だが、
"python 幅優先探索 実装"
などで検索すると先人の実装がいくらでも出てくるので、それを見ながら手元の環境で
from collections import deque
Q = deque()
Q.append(['m', 'n'])
print(Q)
みたいな簡単な確認から行った。
正直頭のいい人だとここまで細かくする必要は全然ないんだけど、しっかり追えるので自分にはとても効果があった。
何が基本的なアルゴリズムなの?っていう人は「レベルアップ問題集」がPaizaラーニングで提供されているのでそっちを見よう。
ただそれを全部解いていると時間がめちゃくちゃかかるので、アルゴリズムは自分で勉強して、確認で問題を解くという流れが効率いいと個人的には思う。
2.無駄に時間を使わない工夫、その手札を増やす
採点はテストケースの突破(50点)と提出までにかかった時間(50点)で行われる。
問題は120分で解き終わって提出までいかないと時間にかかる点数が減点されて99点とかそんな悔しい思いをしてしまうので、コードを書く時間の節約は結構大事だったりする。
ロジック考える方に頭使いたいしね。
ここでいう無駄に時間を使わないということだが、例えば
入力値の受け取り
計算中の値を確認すること
あたりが該当する。
例えば上で話に出たN * Mのマップの場合、大抵は
"N M"
という入力が与えられるが
input_line = input()
N, M = input_line.split()
N, M = int(N), int(M)
わざと冗長に書くとこんな感じになって、毎回手が疲れるし時間ももったいない。これを改善すると
N, M = map(int, input().split())
と書けてこっちの方が手が疲れないし、なんならこれごとチートシートとか作ってコピペできるようにしたらいい。
最初こういった時短のための手札が乏しく、毎回手で書いてたら新しく書いた部分がそもそも書き間違えててエラーおこしてイライラ…みたいな負のループに入ったりしたので今同じような状況の人はぜひ試してほしい。
3.テストケースの想定をまじめにやる
これは単に自分が面倒くさがりなだけ、な可能性もあるが。
採点の際に複数のテストケースを通されるが、この時にプログラミング中には自分が想定していなかったケースで減点されることがある。
要するに大まか合ってるけど細かいところを詰めるとプログラムが対応できていない"惜しい"状態である。
例えば
プログラムを書いている時点で実行できるテストケース以外の処理を実装し忘れる
境界値の処理をミスる
計算に時間がかかりすぎている(Python3は16秒かかると×の判定)
などがあると思う。
特に自分の場合、問題文を深く読んでいないせいで境界値をミスったりするため自分でテストケースを用意して想定している動作をするか試しておくことが重要だった。
上で制限時間120分だから無駄に時間使うなということを書いているが、なんだかんだで結構余る問題も多いため、最後の最後に爪が甘いということがないようしっかり確認するべきである。
こういうこと意識すると捗るかもよ
Dランクの人向け
このランクは簡単な計算ができればランクアップが簡単にできる。
まだ問題の文章は短いので、ここでしっかりどの情報を計算しろって言われているのか考えることに慣れることを意識するといいと思う。
DランクでCランクの問題につまづく人は今やりたい計算をどの文法を使って実装すればいいかわかっていない、あるいはどんな計算が必要か言語化できていないかと思うので、問題文以外にも例を自分で作ってみて理解を深めながら問題を解くといいと思う。
Cランクの人向け
この辺りから問題文が長くなったり、そもそもこれどういう状況?って一発でわからなくなってきたりする。
プログラム自体も長くなってくるので、関数を定義したりして効率的に実装する必要が出てくる。
Aランク問題で要求されるプログラムは、結局Bランクで回答するようなプログラムに上で書いたような定番アルゴリズムを組み合わせる問題が多いので、ここでしっかり”思ってる動作を思ってる通りにするプログラム”を作れるようになっておくと、Aランク問題を解く時にぐっと楽になると思う。
そのためには丁寧に問題を読んで解くことに加えて、いろんな問題を幅広く解いて反復練習が必要だと思う。
まとめ
結局
アルゴリズムの勉強をする
丁寧にロジック組み立てて実装する
ケアレスミスのケアをする
のが大事。