この記事に書いてあることを実践したからといって誰もがランクAに到達できるというわけではありません。あくまで参考という形でお願いします。
自己紹介
こんにちは。Stead08と申します。
現在は地方国立大の経済学部に在籍しています。
専門は地域経済、とりわけ地方での公共交通をゼミで研究しています。
主にプログラミングといったら計量経済学の授業でRという言語を少し触ったぐらい(Excelの関数の高度なやつをやってる感じ)で、
プログラミングは全くの初心者でした。
まあ初心者と言っても、大学一年生の時になんとなくPythonを触っていたので初心者とは言えないかもしれませんが、forループがちょっと使えるぐらいだったので初心者といってもいいと思います。
なぜプログラミングを始めたのか。
第一の理由は大学三年生から始まる就活からの現実逃避です。
経済学部といったら、銀行や保険などの分野に就職する人が割と多いです。他には一般企業の営業職とかですかね…
でそのような分野でいいとこ行こうと思ったら、サークルとか部活とかボランティアとかで企業が惹かれるガクチカ(学生時代に力を入れたこと)を話さないといけないので、そのようなガクチカがない学生はとても不利な状況に置かれるわけです。それで頑張って入ったとしても自分は営業でバリバリ成績を上げられる自信もなかったし、営業という仕事で働いている自分が想像できなかったです。
そんな時に、twitter上でプログラミング学習サイトPaizaを見つけてやり始めました。(実は二年ほど前に一回やっていたのは自分も気づかず…)
初心者が学習する言語は何がいいのか
これはプログラミングを用いてどのような業務に携わりたいのか、はたまた趣味として勉強している方はプログラミングを使って何をしたいのかによると思います。
私も初心者なのでこの分野のプログラミングにはこの言語がおすすめとかはよくわかりません。
私はpythonを選びました。
理由は、計量経済学とか統計学と相性がいいとかという情報からです。(これも定かではありませんが…)
データ分析とかマシンラーニングとかAIとかやりたいのであればPythonはおすすめだと思います。
有識者の方がいらっしゃいましたら訂正お願いします。
本題
結果としてどれだけ勉強したか?
数字で見えるものだとこんな感じです。
19-22時をコアタイムにして毎日この時間は絶対勉強してました。(体調不良とかの日は除く)
とりあえず目標を立てた。
なんかずっと前にちょこっとやってたみたいでCランクまでは上がってました。
だから最初の目標は「二週間でBランクに到達する」としました。
写経はやり方を間違えなければ効率良いと思う
問題集の多くはコード例があるので詰まったらそれをみてそのまま書き写しました。
それだけだと、同じような問題が出てきても対応できないので、そのコードが何をしているのか一行一行コメントをつけてGithubに保存しました。後から自分が見ても何をするコードで、コードの一行一行がどのような処理をしているのか理解できれば、応用が効きます。決して脳死で写したらいけないです。
実際僕が写経したコード
from collections import deque
#マップの行数H,列数w,探索回数n
H, W, = map(int, input().split())
#スタート地点
y, x = map(int, input().split())
#ゴール地点
gy, gx = map(int, input().split())
#que作成
q = deque()
#スタート位置を入れる
q.append((y, x))
#各マスの移動回数を記録するためのリストを作成
l = [[-1] * W for _ in range(H)]
#スタート地点は0回移動
l[y][x] = 0
#マップを入力
mp = []
for _ in range(H):
s = list(input())
mp.append(s)
mp[y][x] = "*"
#bfs
while q:
#queからFIFOで一つ取り出す
ny, nx = q.popleft()
#前後左右の探索
for dy, dx in ((-1, 0), (1, 0), (0, -1), (0, 1)):
#もし上下左右で移動可能だったら
if 0 <= ny + dy < H and 0 <= nx + dx < W and mp[ny + dy][nx + dx] != "#":
#候補がまだ移動したことがない座標だったら
if l[ny + dy][nx + dx] == -1:
#移動元が既に何回移動してきたかがl[ny][nx]でそれに一回追加したものを移動先座標のlに代入
l[ny + dy][nx + dx] = l[ny][nx] + 1
#移動したのでそれを示すために"*"にする
mp[ny + dy][nx + dx] = "*"
#移動先をqueに入れる
q.append((ny + dy, nx + dx))
#ゴール判定
if mp[gy][gx] == "*":
#ゴールまで最短何歩移動するか
print(l[gy][gx])
else:
print("No")
CランクからBランクに上がるためにやったこと
ぶっちゃけ、一問でも解けたらBランクに上がることができるのでそこまで高い壁ではないと思います。
私はこんな感じでBランクゲットまで勉強しました。
1. paizaの有料プランに入った。
とりあえず一ヶ月のプランに入ることで、やらないと1000円無駄になるという縛りをつけました。
行動経済学でいうコミットメントデバイスってやつです。
コミットメントデバイスとは"目標を後に回してしまう先延ばし行動を防止し、計画を確実に実行できるように、将来の行動に制約をかける仕組み" (イケダ)です。
問題集とか制限なくできるのはストレスフリーです。
2. Dランク、Cランク向けのレベルアップ問題集をとにかくすすめた。
問題集の概要でランク目安が書いてあるので片っ端進めた。
3. 一日一問はスキルチェック問題を解いた。
これは本番でも、問題集にある過去問題でもいいのでスキルチェック問題を一日一問は解くようにしました。
最初は、問題文の意味を汲み取ることさえ難しかったですが、だんだんわかるようになるので心配いらないです。
結局問題集をやってスキルチェック問題を解くという二つの繰り返しをしていればいつかはBランクに到達できます。
ここまででやって気づいたこと
Paizaはスキルチェックで
・ウェブ検索にて、他の受験者の解答コードを検索して閲覧する行為
・解答後においても、他者と問題について相談等する行為
を禁止しています。
(
)より。
しかし、問題で使うであろうアルゴリズムのコードを参照することは認められています。
つまるところ、どのアルゴリズムを使うか正しい見当がつくのであれば、アルゴリズムのコードを丸暗記する必要はないのでは?と気づいてしまった。
実務でも、コードはみんなググるだろうし、このルールは妥当だと思います。
BランクからAランクに上がるためにやったこと
とりあえずAランクの問題一問解いてみて、問題の複雑さはBランクよりむしろシンプルになってる気がしました。
しかし舐めて取りかかると、コードのテスト段階で時間オーバーが多発。
慌ててAランクの問題の入力数値の範囲を見てみると0 <= N <= 100,000とか書いてあってそりゃこのやり方だったら間に合わないと自身の実力を突きつけられました。
そこで計算効率がいいアルゴリズムについて学ぶことにしました。
競プロでは有名らしいですが、とりあえずPythonで実装するようりも、そのアルゴリズムがどのような仕組みで動いているのか理解する必要があると思い,amazon kindleで色々買いました。
買った中で一番いいなと思ったのは、
アルゴリズムの基礎が学べていいです。数学の知識が多少必要になるのでそこだけ注意してください。
pythonでの実装は色々なサイトを参考にしました。
これとか、
これとか、
二部探索でのアプローチの仕方の例
便利なライブラリの一覧と簡単な説明
組み合わせで使えるライブラリの説明とか
(これからじっくり勉強するつもり)
あとはpaizaのレベルアップ問題集で、
・線形探索メニュー
・二分探索メニュー
・データセット選択メニュー
・DPメニュー
・スタック・キューメニュー
・素朴なソートアルゴリズムメニュー
・累積和メニュー
・幅優先探索・深さ優先探索メニュー
・Bランクレベルアップメニュー
・Aランクレベルアップメニュー
とかを一周しました。
Aランクの問題は計算量が大幅に削減できるアルゴリズムの実装が必要な問題があるので、まずはアルゴリズムを知ることが重要だと感じました。
記事を書くのが初めてでお見苦しいところもありますが、参考になったら幸いです。
質問もコメントで受け付けます!
works cited
イケダ マリコ. (2020, November 23). コミットメントデバイス. UX TIMES. Retrieved December 13, 2022, from https://uxdaystokyo.com/articles/glossary/commitment-device/