#はじめに
コーディングテスト「track」の標準入力が少し独特で、アルゴリズム書く前にそっちに躓いてしまいました。なので、データの取得の仕方を解説します。
#例題
※問題文は必要な部分のみ抽出しています
ある数字列が与えられたとき、最小の数と最大の数をスペース間隔で表示し、数字列を小さい順に並べるプログラムを実装してください。
入出力例
標準入力
3
3 1 5
標準出力
1 5
135
入力ルール
標準入力は以下のフォーマットに従って渡されます
n
a1 a2 a3 ...
・nは数字の要素数
・a1,a2,a3...は0以上の整数
標準入力の取得方法
main.py内で定義されているmainという関数からlinesの名前で取得できます。
#コードの解説
デフォルトでコード部分は既に以下が書かれていると思います。
def main(lines):
# このコードは標準入力と標準出力を用いたサンプルコードです。
# このコードは好きなように編集・削除してもらって構いません。
# ---
# This is a sample code to use stdin and stdout.
# Edit and remove this code as you like.
for i, v in enumerate(lines):
print("line[{0}]: {1}".format(i, v))
if __name__ == '__main__':
lines = []
for l in sys.stdin:
lines.append(l.rstrip('\r\n'))
main(lines)
これでデバックを実行すると以下が表示されます
line[0]: 3
line[1]: 3 1 5
for文でやっているように、入力のlinesの1行目がn , 2行目がa1 a2 a3ということですね。
#実装方法
とりあえず入力データを取得する部分だけ実装してみます。
コード
def main(lines):
# このコードは標準入力と標準出力を用いたサンプルコードです。
# このコードは好きなように編集・削除してもらって構いません。
# ---
# This is a sample code to use stdin and stdout.
# Edit and remove this code as you like.
for i, v in enumerate(lines):
#print("line[{0}]: {1}".format(i, v))
if(i==0): #1行目は数字の要素数 n
n = v
elif(i==1):
a = list(map(int, v.split(" "))) #1行目じゃない(2行目)の時は数字のリストを取得
print(n)
print(a)
if __name__ == '__main__':
lines = []
for l in sys.stdin:
lines.append(l.rstrip('\r\n'))
main(lines)
入力例
3
3 1 5
出力例
3
[3, 1, 5]
コードの解説をします。
for文で1行目(i=0)の時は、数字の要素数なのでnに代入します
**2行目(i=1)**の時は数字の要素をlistで取得しています。また2行目の部分はスペースで空いているので、**v.split(" ")**でスペース区切りしています。
出力例を見てもらうと、1行目は数字の数、2行目はリストが取得出来ています。
この**list(map(int, v.split(" ")))**の部分は以下を参考にしました。
解答
import sys
def main(lines):
# このコードは標準入力と標準出力を用いたサンプルコードです。
# このコードは好きなように編集・削除してもらって構いません。
# ---
# This is a sample code to use stdin and stdout.
# Edit and remove this code as you like.
for i, v in enumerate(lines):
#print("line[{0}]: {1}".format(i, v))
if(i==0): #1行目は数字の要素数 n
n = v
elif(i==1):
a = list(map(int, v.split(" "))) #1行目じゃない(2行目)の時は数字のリストを取得
#print(n)
#print(a)
la = list(sorted(a)) #リストの要素を小さい順に並びかえ
print(la[0]," ",la[len(a)-1]) #1番小さい0番目と1番大きいlen(a)-1番目をスペース空けて表示
for j in la:
print(j,end="") #全ての要素を詰めて表示
if __name__ == '__main__':
lines = []
for l in sys.stdin:
lines.append(l.rstrip('\r\n'))
main(lines)
出力
1 5
135
アルゴリズムについてはコメントを見てください。
#コツ
デフォルトで実装されてる
for i, v in enumerate(lines):
を利用するのがポイントです!