読者です 読者をやめる 読者になる 読者になる

Psycho-Logic

Psychology, Programming, and occasional Rat.

Python3 DAY4:paizaスキルチェック「プレゼント選び」

Python3 paiza
今回の問題は、
「標準入力で1行目に渡される成績に応じて、2行目の3つのプレゼントから適切なプレゼントを選択して出力せよ」
というもの。
回答までにかかった時間は10分21秒と前回と同程度。
しかし、今回は初めてスコアが100点ではありませんでした(なんと40点…)。
そこも含めて確認していきたいと思います。

 

最初に考えたコード

 
input_lines = input()
grade = input_lines
present = input_lines.split(" ")
if grade == 1:
    print(present[0])
elif grade == 2:
    print(present[1])
else:
    print(present[2])

 

2行目の grade = input_lines は成績を表す標準入力の1行目を受け取るための変数で、問題なし。
 

今回のハイライト

 
present = input_lines.split(" “)
 
これは、
 
「present変数に標準入力で渡されたプレゼントリストを空白区切りでリストとして格納」
 
という発想です。
考え方としては間違いではないのですが、input_lines変数には標準入力1行目の成績を表すものしか入っていません。
改行された標準入力を受け取るには、もう1度 input() を受け取るための変数が必要です。
毎度のことのようですが、
 
「標準入力とinput()メソッドについての理解不足」
 
が原因の間違いになります。
 

2つ目の問題点

 
 if grade == 1:
 
これは、一見すると正しそうに見えます(私にとっては)。
これも上記と同じく
 
「input()メソッドについての理解不足」
 
が原因の間違いですね。
標準入力で渡されたものはすべてstr型として処理されることを完全に失念していました。
比較対象を "1" とするか、int(grade) とする必要がありますね。
6行目の elif grade == 2: も同様の間違いになります。

 

スコアが40点だったワケ

ここで問題になるのは、8行目の else: です。
実際にはこのコードのif文の中では唯一正しい部分なのですが、だからこそ勘違いを生み出しました。
present変数を訂正すると、このコードのエラーはなくなります。
つまり、
 
出力はすべて8行目の else: によって処理され、present[2] となるのです。
 
もし、問題の「提出前動作確認」で渡される値(成績)が present[2] に格納されているプレゼントに対応していたら、どうでしょう。
そうです、提出前動作確認では「正解」となるのです。
おかげで10回ある本番のテスト試行では、4つしか「正解」とはならなかったのです。
 
いやはや、なんとも…。
 

参考サイト

Python競技プログラミングする時に知っておきたいtips(入出力編):http://qiita.com/lethe2211/items/6cbade2bc547649bc040