この記事は拙著「AtCoder 凡人が『緑』になるための精選50問詳細解説」のサンプルです
価格:100円
kindle:https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf):https://sano192.booth.pm/items/3179185
前:https://qiita.com/sano192/items/c908830ad0800afe139f
次:https://qiita.com/sano192/items/9e611a60ba2a49b94e89
【目標】
・関数の実装ができるようになる
【概要】
やること自体は簡単なのだが、いざ実装しようとするとどうすればよいかわからなかったり、バグが大量に出てしまったという人が多かったと思う。問題文で関数が指定されていたり、複雑な操作が必要なものはその部分を関数として作ってしまうのが一番確実で手っ取り早い。この問題で関数の作り方を覚えよう。
【方針】
問題文は最初ごちゃごちゃとわけのわからないことが書いているが、「例えば・・・」の部分を見れば何をすればよいかわかる。
必要な関数は3つ。
g1:数字を受け取って大きい順に並び替える
g2:数字を受け取って小さい順に並び替える
f:g2-g1
これを自作の関数として先に作ってしまえば後は問題文の指示通りに計算するだけ。
そもそもプログラミングにおける関数が何かわからない場合は以下のサイトを見てほしい。
https://www.python.jp/train/function/index.html
【実装】
まず関数g1を作ろう。
g1はどのような処理を行うか、順番に書くと以下のようになる。
(1)数字を引数として受け取る(314)
(2)受け取った数字を文字列(str)にする("314”)
(3)文字列を一文字ずつリストに格納する([“3”,“1”,“4”])
(4)リストを並び替える([“4”,“3”,“1”])
(5)リストを結合し、文字列にする(“431”)
(6)文字列を数値(int)にして返す(431)
(1)数字を引数として受け取る(314)
関数を作るときは
def 関数名(引数):
と書く。
引数の名前はxにしよう。これで数字xを受け取れた。
def g1(x):
(2)受け取った数字を文字列(str)にする("314”)
数字xがintのままだと一桁ずつ取り出す処理が面倒だ。一旦文字列strに変換しよう。
x=str(x)
(3)文字列を一文字ずつリストに格納する([“3”,“1”,“4”])
並び替えのための準備。1桁ずつ=1文字ずつリストに格納する。
list(文字列)と書けば1文字ずつリストに格納できる。
x=list(x)
(4)リストを並び替える([“4”,“3”,“1”])
大きい順に並び替えるため、「reverse=True」にしてソート。
x.sort(reverse=True)
(5)リストを結合し、文字列にする(“431”)
リストの結合は
"".join(文字列のリスト)
と書く。
「python リスト 結合 文字列」と検索すれば出てくるのでこの書き方を暗記する必要はない。
x="".join(x)
(6)文字列を数値(int)にして返す(431)
関数で値を返すときは
return 値
と書く。
xをintへ再変換して返す。
return int(x)
これでg1を関数として定義できた。
def g1(x):
x=str(x)
x=list(x)
x.sort(reverse=True)
x="".join(x)
return int(x)
公式解説の「実装例(Python)」ではこの関数を一行で作っているが、ややこしいことをすると余計なバグが増える。行数が増えてもよいのでわかりやすいコードを書くようにしよう。
g1ができればg2はg1をコピペして並び替えを小さい順にするだけ。つまり「reverse=True」をなくしてしまえば良い。
def g2(x):
x=str(x)
x=list(x)
x.sort()
x="".join(x)
return int(x)
fはg1-g2を行うだけ。
def f(x):
return g1(x)-g2(x)
これで3種類の関数ができた。
あとは初期値Nに対してK回fを行うだけで答えを出せる。
具体的には
0回目:N=a0
1回目:f(a0)=a1
2回目:f(a1)=a2
3回目:f(a2)=a3
…
K回目:f(aK-1)=aK
と処理を行う。
入力を受け取る。
N,K=map(int, input().split())
初期値Nを変数aに入れる。
a=N
aに対してK回fを行う。
for i in range(K):
a=f(a)
答えを出力する。
print(a)
【コード全文】
def g1(x):
x=str(x)
x=list(x)
x.sort(reverse=True)
x="".join(x)
return int(x)
def g2(x):
x=str(x)
x=list(x)
x.sort()
x="".join(x)
return int(x)
def f(x):
return g1(x)-g2(x)
N,K=map(int, input().split())
a=N
for i in range(K):
a=f(a)
print(a)
この記事は拙著「AtCoder 凡人が『緑』になるための精選50問詳細解説」のサンプルです
価格:100円
kindle:https://www.amazon.co.jp/dp/B09C3TPQYV
booth(pdf):https://sano192.booth.pm/items/3179185
前:https://qiita.com/sano192/items/c908830ad0800afe139f
次:https://qiita.com/sano192/items/9e611a60ba2a49b94e89