【ページ更新日:2020年10月26日】
毎日Pythonでは、簡単なPythonのプログラムコードを紹介していきます。
今日のプログラムはAtCorder2019の問題を使用しています。
競技用プログラミングの問題になります。
問題
問題は次のとおりです。
長さNの整数列がサーバーに保管されている。つい先ほどまで、この列には1からNまでの整数が1個ずつ含まれていた。
しかし、たった今発生したトラブルにより、列のいずれか1個の要素が別の1以上N以下の整数に書き換えられた可能性がある。あるいは、何の書き換えも発生しなかったかもしれない。
トラブル発生後の整数列A1,…,ANが与えられる。これを読み込み、書き換えが発生していたかを判定し、発生していた場合にはどの整数がどの整数に書き換えられたかを報告するプログラムを作成せよ。書き換えが発生していなかった場合、Correct と出力せよ。
AtCorder 第一回アルゴリズム実技検定過去問2019年12月D問題
プログラムコード
問題の解答となるコードは次のとおりです。
※間違いの指摘やアドバイスなどあれば教えてください。
N = int(input("データ数を入力してください >>> ")) list = [] check_list = [0] * N flag = 0 for i in range(N): m = int(input()) list.append(m) check_list[m-1] += 1 for i in range(N): if check_list[i] == 0: print ("{} が {} に書き換えられた".format(i+1,check_list.index(2)+1)) flag = 1 if flag == 0: print("Correct")
ポイント
今回のPythonコードのポイントは次の1点です。
- リストの初期化:check_list = [0] * N
- indexメソッド
リストの初期化「要素数を決める」
次のようにすることで、要素0を定数N個にすることができる。
check_list = [0] * N
たとえば、N=5のとき要素数5のリストができる。
# 要素数5のリストをつくる check_list = [0] * 5 # => check_list = [0,0,0,0,0]
リストのindexメソッド
indexメソッドは、指定した要素をもつインデックス番号を返します。
今回のコードでは次のように使用されていました。
print ("{} が {} に書き換えられた".format(i+1,check_list.index(2)+1))
リファクタリング
調べながら、より短くしてみました。
リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。
リファクタリングしたコードを紹介したいと思います。
コードは次のとおりです。
alist = [int(input()) for _ in range(6)] alist.sort(reverse = True) print(f"3番目に大きい数は {alist[2]} です")