LoginSignup
45
31

More than 1 year has passed since last update.

【保存版!】コーディングテスト「track」の標準入力の対処法(Python)

Last updated at Posted at 2021-11-18

はじめに

コーディングテスト「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):

を利用するのがポイントです!

45
31
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
31