「上達への近道は模倣すること」とよく言われるように、プログラミングにおいて上級者のコードを模倣することは非常に重要です。上級者のコードを真似することで、開発に必要なDRY、可読性、一貫性を意識したコードの書き方を効率的に身につけることができます。
初心者向けの問題を除く模範解答の多くは計算量やDRYを意識して作成されています。模範解答を見る方法はこちらの記事で解説しています。
模範解答を見てみよう
それではユーザーのコードと模範解答を比較してみましょう。
配列heightsが与えられるので、山型になっているかチェックするisMountainという関数を定義してください。
ユーザーコード例:
計算が煩雑で非常に理解しづらいコード
def isMountain(height):
montain = [0]*(len(height)-1)
a = {}
b = {}
top = False
minus = len(height)
for i in range(1, len(height)):
if height[i]-height[i-1] > 0:
montain[i-1] = 1
elif height[i]-height[i-1] < 0:
if top == False:
minus = i-1
top = True
montain[i-1] = -1
else:
montain[i-1] = 0
if set(montain[:minus]) == {1} and set(montain[minus:]) == {-1}:
return True
else:
return False
模範解答:
無駄な計算が一切なく、スマートでクリーンなコード
def isMountain(height):
l = len(height)
if l <= 0 or height[0] > height[1]: return False
# 最大値・最小値・インデックスの初期値
maxVal = -float('inf')
minVal = float('inf')
i = 0
# 昇順が終わるまで処理を繰り返します
while i < l and height[i] > maxVal:
maxVal = height[i]
i += 1
# 昇順のみの配列の場合、falseを返します
if i == l: return False
# 降順が終わるまで処理を繰り返します
while i < l and height[i] < minVal:
minVal = height[i]
i += 1
# 配列の末尾まで降順が続いていなかったらfalseを返します
return i == l
アウトプットが最も重要
ハードコードでも無駄の多いコードでも良いので、必ず自分で問題を解いてコンテンツで学習したことをアウトプットしてください。アウトプットしている最中が最も実力が身につきます。
中上級者向け:
一度合格したコードを以下の点に気をつけてリファクタリングを行ってください。
一度合格したコードを以下の点に気をつけてリファクタリングを行ってください。
- 無駄な計算は行われていないか
- 可読性は意識されているか
- DRYを意識しているか
変数の命名や関数の分解を意識しながらコードの書き方を学習し、何も見らずに同じように解いてみましょう。特にプログラミング暦が浅い間は必ず模範解答の書き方を復習することで良い型を身につけてください。Recursionのユーザーでも模範解答を勉強したユーザーと自己流で解いただけのユーザーで実力に大きな差が生まれています。