🔙
🔝

標準入力

競プロやいくつかの学習サイトで役立ちます👍

Chatpter.1 - input()

標準入力とは

  • ここで紹介する「標準入力」というものは、主に『競技プログラミング』という、 多くの参加者がプログラミングの実力を競い合って評価されるコンテストでよく使われる入力方式です。

  • 国内で最も有名なのが「AtCoder」というコンテストです。

  • それをこれから参加して頑張りましょう!ということではありません。

  • そこには過去に出題された「この問題をプログラムで作ってください」という、 通称「過去問」が数多く掲載されています。


  • それらの問題を使ってプログラムを自分で作ってみることが、学習する上で非常に有益なんです!

  • せっかく基礎を学んでも、作りたいプログラムが無ければ宝の持ち腐れです。

  • そしてせっかく学んだのにどんどん忘れていきます。

  • 作りたいアプリの為に学んでいるのならば特に問題は無いですが、そうでない場合はまずは「これを作ってください。」と与えられたたくさんの問題をガシガシ解いていくのが手っ取り早いです。

  • おすすめは「paiza」という学習サイトで、こちらは問題集とスキルチェックという2つの方法で出題されています。

  • AtCoder も paiza も、詳しいことは各サイト上の説明にお任せします。

  • 最もやさしい難易度の問題(paizaはDランク)は、1章の内容がわかっていればだいたい解けるはずです。

  • paizaでは先に問題集を解いてプログラムを組むことに慣れてからスキルチェックに挑んでみると良いです。

  • その際に使われる「標準入力」というものをこれから紹介していきます。

  • 「標準入力」は、与えられたデータを変数に取り込んで使う為に必要な「呪文」です。

  • 解説はしますけど、内容は理解しなくて全く問題ありません。

  • このデータを入力したい時にどの入力方法を使えばよいか。

  • まずはいろいろな方法を知って、それから徐々に使い慣れていきましょう。

input()

  • input() という関数がどういうものかを知りましょう。


  • print() が「出力」に対して、input() は「入力」になります。

  • まずはこれを見てください。

    s = input('入力: ')
    print(s)
    
    入力: |← | はカーソルのつもり😅
  • 入力: と表示された後に「入力待ち」が発生します。
    ここになにか文字を、例えば『もじれつ』と入力して[Enter]キーを押すと、

  • 入力: もじれつinput() もじれつ← print()

    と、表示されます。

  • 入力された値は、必ず 文字列型(str) で読み取ります。

  • AtCoder や paiza では、この入力する値(入力値にゅうりょくちと言います)がすでに与えられています。

  • わざわざ自分で値を入力したり、自分で変数に値を直接打ち込んで代入しないで、与えられた入力値を input() 関数を使って読み取ります。

  • 「読み取る」とかいきなり難しそうに感じますが、ほぼ定型文なので、これらを参考に面倒でわけのわからない標準入力とやらを済ませてしまいましょう。

  • ネコプロでは標準入力は使いません。基本、読むだけなので。

  • まだ他のサイトに興味が無い方は、完全に読み飛ばして次に進んでください。

  • 興味が出てきた時に、ピンポイントでここに訪れてもらえればそれでOKです。

難易度:とてもやさしい

難易度:とてもやさしい

整数を1つ入力する - int(input())

整数を1つ入力する

    n = int(input())
    
    1
        1
    
    n = 1

    2
        100
    
    n = 100

    3
        -123
    
    n = -123

    【 解説 】
    1
        1
    

    n = int(input())
    
    n = int('1')
    
    n = 1
    
  • 入力値が複数行の場合は、変数を変えて同じものを書いていくだけです。

    4
        1
        12
    

    n = int(input())
    m = int(input())
    
    n = int('1')
    m = int(input())
    
    n = 1
    m = int(input())
    
    n = 1
    m = int('12')
    
    n = 1
    m = 12
    

    順に書いていくと長~~くなってしまうので、以降はある程度まとめた形にさせていただきます。🙏

文字列を1つ入力する - input()

文字列を1つ入力する

    s = input()
    
    1
        もじれつ
    
    s = 'もじれつ'

    2
        Hello world!
    
    s = 'Hello world!'

    3
        -123
    
    s = '-123'

    【 解説 】
    2
        Hello world!
    

    s = input()
    
    s = 'Hello world!'
    
  • 入力値が複数行の場合は、変数を変えて同じものを書いていくだけです。

    4
        Hello world!
        Bonjour, le monde!
    
    s = input()
    t = input()
    
    s = 'Hello world!'
    t = 'Bonjour, le monde!'
    
  • リストに変換したい時は list(input()) に置き換えます。

    5
        #..#.#
    
    s = list(input())
    
    s = list('#..#.#')
    
    s = ['#', '.', '.', '#', '.', '#']
    
難易度:やさしい

難易度:やさしい

横並びの整数を入力する - map(int, input().split())

変数ごとに振り分ける場合

    n, m = map(int, input().split())
    
    1
        1 2
    
    n = 1
    m = 2

    2
        100 0
    
    n = 100
    m = 0

    3
        123 -123
    
    n = 123
    m = -123

    【 解説 】
    1
        1 2
    

    n, m = map(int, input().split())
    
    n, m = map(int, '1 2'.split())
    
    n, m = map(int, ['1', '2'])
    
    n, m = [1, 2]
    

    1n へ、
    2m へ、代入されていきます。

    このような代入のやり方を「アンパック(unpack) 代入」または「アンパッキング代入」と言います。

  • アンパック代入は「変数」の個数「代入する値(要素)」の個数同じ個数でなければいけません。

  • 1つでも異なるとパッキンマンにやられます。エラーになります。


  • 代入しようとする値の個数が多すぎて力が出ない時🤢

    n, m = [1, 2, 3]
    
    Traceback (most recent call last):
      File "Main.py", line 1, in <module>
        n, m = [1, 2, 3]
    ValueError: too many values to unpack (expected 2)
    

  • 代入しようとする値の個数が少なすぎて力が出ない時🤢

    n, m = [1]
    
    Traceback (most recent call last):
      File "Main.py", line 1, in <module>
        n, m = [1]
    ValueError: not enough values to unpack (expected 2, got 1)
    

  • わりとうっかりしてよく見てしまうエラーです。😹

  • 入力値が複数行の場合は、変数を変えて同じものを書いていくだけです。

    4
        1 5
        12 -21
    

    a, b = map(int, input().split())
    n, m = map(int, input().split())
    
    a, b = map(int, '1 5'.split())
    n, m = map(int, '12 -21'.split())
    
    a, b = map(int, ['1', '5'])
    n, m = map(int, ['12', '-21'])
    
    ↓ map() は本当は <map object at 0x149d2f2f30d0>
    ↓ でもこのまま代入できる
    a, b = [1, 5]
    n, m = [12, -21]
    
    ↓ (おまけ) この代入方法もアンパック代入と言います
    a, b = 1, 5 # (1, 5) の () が省略されている
    n, m = 12, -21 # (12, -21) の () が省略されている
    
    ↓ 結果、それぞれにこんな感じで代入される
    a = 1
    b = 5
    n = 12
    m = -21
    
横並びの整数をリストで入力する - list(map(int, input().split()))

リストとして代入する場合

    nums = list(map(int, input().split()))
    
    1
        1 2 3 4 5
    
    nums = [1, 2, 3, 4, 5]
    【 解説 】
    1
        1 2 3 4 5
    

    nums = list(map(int, input().split()))
    
    nums = list(map(int, '1 2 3 4 5'.split()))
    
    nums = list(map(int, ['1', '2', '3', '4', '5']))
    
    ↓ map() は本当は <map object at 0x145c147291c0>
    nums = list(1, 2, 3, 4, 5)
    
    nums = [1, 2, 3, 4, 5]
    

  • どんなにたくさん分割されても、この一文だけで全て整数&リスト化されます。

横並びの文字列を入力する - input().split()

変数ごとに振り分ける場合

    s, t = input().split()
    
    1
        あ い
    
    s = 'あ'
    t = 'い'

    2
        閻魔 あい
    
    s = '閻魔'
    t = 'あい'

    3
        Hello world!
    
    s = 'Hello'
    t = 'world!'

    【 解説 】
    2
        閻魔 あい
    

    s, t = input().split()
    
    s, t = '閻魔 あい'.split()
    
    s, t = ['閻魔', 'あい']
    
    s = '閻魔'
    t = 'あい'
    

  • input() は入力値を文字列で読み取るだけに、整数と比べて簡単になっています。

  • 入力値が複数行の場合は、変数を変えて同じものを書いていくだけです。

    4
        ONE Kanon
        AIR CLANNAD
    

    a, b = input().split()
    c, d = input().split()
    
    a, b = 'ONE Kanon'.split()
    c, d = 'AIR CLANNAD'.split()
    
    a, b = ['ONE', 'Kanon']
    c, d = ['AIR', 'CLANNAD']
    
    a = 'ONE'
    b = 'Kanon'
    c = 'AIR'
    d = 'CLANNAD'
    
横並びの文字列をリストで入力する - input().split()

リストとして代入する場合

    names = input().split()
    
    1
        閻魔 あい
    
    names = ['閻魔', 'あい']
    【 解説 】
    1
        閻魔 あい
    

    names = input().split()
    
    names = '閻魔 あい'.split()
    
    names = ['閻魔', 'あい']
    

  • もともと .split() メソッドは、文字列を分割して リストにする 機能なので、そのままの形で使えます。

  • どんなにたくさん分割されても、この一文だけで済みます。

難易度:ふつう

難易度:ふつう

複数行の整数をリストで入力する - 内包表記

複数行の整数をリストで入力する

    N = int(input())  # N は行数
    nums = [int(input()) for _ in range(N)]
    
    1
        2
        1
        2
    
    nums = [1, 2]

    2
        3
        100
        0
        50
    
    nums = [100, 0, 50]

    3
        5
        123
        -123
        25
        1024
        -1
    
    nums = [123, -123, 25, 1024, -1]

    【 解説 】
    1
        2
        1
        2
    

    N = int(input())
    nums = [int(input()) for _ in range(N)]
    
    ↓ まず N の値を読み取る
    N = int('2')
    nums = [int(input()) for _ in range(N)]
    
    N = 2
    nums = [int(input()) for _ in range(N)]
    
    N = 2
    nums = [int(input()) for _ in range(2)]
    
    ↓ 2行目の入力値を読み取る
    N = 2
    nums = [int('1') int(input()) for _ in range(2)]
    
    N = 2
    nums = [1 int(input()) for _ in range(2)]
    
    ↓ 3行目の入力値を読み取る
    N = 2
    nums = [1, int('2') int(input()) for _ in range(2)]
    
    N = 2
    nums = [1, 2 int(input()) for _ in range(2)]
    
    ↓ for文の処理が終了して結果となる
    N = 2
    nums = [1, 2]
    

  • たった2行のプログラムで、たった3行の入力値でもこれだけの処理がなされています。

複数行の文字列をリストで入力する - 内包表記

複数行の文字列をリストで入力する

    N = int(input())
    lst = [input() for _ in range(N)]
    
    1
        2
        Hello
        world!
    
    lst = ['Hello', 'world!']

    2
        3
        Mike
        Kuro
        Tama
    
    lst = ['Mike', 'Kuro', 'Tama']

    3
        5
        デ
        ス
        ノ
        ヲ
        ト
    
    lst = ['デ', 'ス', 'ノ', 'ヲ', 'ト']

    【 解説 】
    1
        2
        Hello
        world!
    

    N = int(input())
    lst = [input() for _ in range(N)]
    
    ↓ まず N の値を読み取る
    N = int('2')
    lst = [input() for _ in range(N)]
    
    N = 2
    lst = [input() for _ in range(N)]
    
    N = 2
    lst = [input() for _ in range(2)]
    
    ↓ 2行目の入力値を読み取る
    N = 2
    lst = ['Hello' input() for _ in range(2)]
    
    ↓ 3行目の入力値を読み取る
    N = 2
    lst = ['Hello', 'world!' input() for _ in range(2)]
    
    ↓ for文の処理が終了して結果となる
    N = 2
    lst = ['Hello', 'world!']
    

複数行にわたる横並びの整数をリストで入力する - 二次元リスト

複数行にわたる横並びの整数をリストで入力する

    N = int(input())
    nums = [list(map(int, input().split())) for _ in range(N)]
    
    1
        2
        0 1 2
        3 4 5
    
    nums = [[0, 1, 2], [3, 4, 5]]

    2
        3
        2 4 6 8
        3 6 9
        4 8 12 16 20
    
    nums = [[2, 4, 6, 8], [3, 6, 9], [4, 8, 12, 16, 20]]

    3
        5
        0 1
        2 3
        4 5
        6 7
        8 9
    
    nums = [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]

    【 解説 】
    1
        2
        0 1 2
        3 4 5
    

    N = int(input())
    nums = [list(map(int, input().split())) for _ in range(N)]
    
    ↓ まず N の値を読み取る
    N = int('2')
    nums = [list(map(int, input().split())) for _ in range(N)]
    
    N = 2
    nums = [list(map(int, input().split())) for _ in range(N)]
    
    N = 2
    nums = [list(map(int, input().split())) for _ in range(2)]
    
    ↓ 2行目の入力値を読み取る
    N = 2
    nums = [list(map(int, '0 1 2'.split())) list(map(int, input().split())) for _ in range(2)]
    
    N = 2
    nums = [list(map(int, ['0', '1', '2'])) list(map(int, input().split())) for _ in range(2)]
    
    ↓ (途中省略)
    N = 2
    nums = [[0, 1, 2] list(map(int, input().split())) for _ in range(2)]
    
    ↓ 3行目の入力値を読み取る (途中省略)
    N = 2
    nums = [[0, 1, 2], [3, 4, 5] list(map(int, input().split())) for _ in range(2)]
    
    ↓ for文の処理が終了して結果となる
    N = 2
    nums = [[0, 1, 2], [3, 4, 5]]
    

  • 目で追うのを諦めたくなるような複雑さに見えますが、int(input())list(map(int, input().split()))に変わっただけです。

  • 結果も二次元リストとなっただけです。

複数行にわたる横並びの文字列をリストで入力する - 二次元リスト

複数行にわたる横並びの文字列をリストで入力する

    N = int(input())
    lst = [input().split() for _ in range(N)]
    
    1
        2
        Hello world!
        西園寺 世界!
    
    lst = [['Hello', 'world'], ['西園寺', '世界!']]

    2
        3
        # # #
        # . #
        # # #
    
    lst = [['#', '#', '#'], ['#', '.', '#'], ['#', '#', '#']]

    3
        2
        One for all , all for one
        YES, WE are CATs!
    
    lst = [['One', 'for', 'all', ',', 'all', 'for', 'one'], ['YES,', 'WE', 'are', 'CATs!']]

    【 解説 】
    1
        2
        Hello world!
        西園寺 世界!
    

    N = int(input())
    lst = [input().split() for _ in range(N)]
    
    ↓ まず N の値を読み取る
    N = int('2')
    lst = [input().split() for _ in range(N)]
    
    N = 2
    lst = [input().split() for _ in range(N)]
    
    N = 2
    lst = [input().split() for _ in range(2)]
    
    ↓ 2行目の入力値を読み取る
    N = 2
    lst = ['Hello world!'.split() input().split() for _ in range(2)]
    
    N = 2
    lst = [['Hello', 'world!'] input().split() for _ in range(2)]
    
    ↓ 3行目の入力値を読み取る (途中省略)
    N = 2
    lst = [['Hello', 'world!'], ['西園寺', '世界!'] input().split() for _ in range(2)]
    
    ↓ for文の処理が終了して結果となる
    N = 2
    lst = [['Hello', 'world!'], ['西園寺', '世界!']]
    

  • 文字列の途中に半角スペースがある場合の二次元リスト化です。

複数行にわたる1つの文字列をリスト化して入力する - マップ化

複数行にわたる1つの文字列をリスト化して入力する

    N = int(input())
    lst = [list(input()) for _ in range(N)]
    
    1
        2
        #.#.#
        .#.#.
    
    lst =
    [['#', '.', '#', '.', '#'], ['.', '#', '.', '#', '.']]

    2
        3
        ###
        #.#
        ###
    
    lst =
    [['#', '#', '#'], ['#', '.', '#'], ['#', '#', '#']]

    3
        5
        #
        ##
        ###
        ####
        #####
    
    lst =
    [['#'], ['#', '#'], ['#', '#', '#'], ['#', '#', '#', '#'], ['#', '#','#','#','#']]

    【 解説 】
    1
        2
        #.#.#
        .#.#.
    

    N = int(input())
    lst = [list(input()) for _ in range(N)]
    
    ↓ まず N の値を読み取る
    N = int('2')
    lst = [list(input()) for _ in range(N)]
    
    N = 2
    lst = [list(input()) for _ in range(N)]
    
    N = 2
    lst = [list(input()) for _ in range(2)]
    
    ↓ 2行目の入力値を読み取る
    N = 2
    lst = [list('#.#.#') list(input()) for _ in range(2)]
    
    N = 2
    lst = [['#', '.', '#', '.', '#'] list(input()) for _ in range(2)]
    
    ↓ 3行目の入力値を読み取る (途中省略)
    N = 2
    lst = [['#', '.', '#', '.', '#'], ['.', '#', '.', '#', '.'] list(input()) for _ in range(2)]
    
    ↓ for文の処理が終了して結果となる
    N = 2
    lst = [['#', '.', '#', '.', '#'], ['.', '#', '.', '#', '.']]
    

  • 入力値として与えられた二次元マップを、後で部分的に書き換える場合に使う方法です。

  • 問題の難易度が上がると使うようになります。

難易度:むずかしい

難易度:むずかしい

様々な値を任意の型に変換する - リスト内包表記

様々な値を任意の型に変換する - リスト内包表記

    lst = [[int(x), s] for x, s in [input().split()]][0]
    
    1
        1 kotetsu
    
    lst = [1, 'kotetsu']

    2
        2000 g
    
    lst = [2000, 'g']

    3
        14 才
    
    lst = [14, '才']

    【 解説 】
    3
        14 才
    

    lst = [[int(x), s] for x, s in [input().split()]][0]
    
    lst = [[int(x), s] for x, s in ['14 才'.split()]][0]
    
    lst = [[int(x), s] for x, s in [['14', '才']]][0]
    
    lst = [[int(x), s] for x='14', s='才' in [['14', '才']]][0]
    
    lst = [[int('14'), '才'] for x='14', s='才' in [['14', '才']]][0]
    
    lst = [[14, '才'] for x='14', s='才' in [['14', '才']]][0]
    
    lst = [[14, '才']][0]
    
    ↓ 添字の [0] で、中のリストを取り出す
    lst = [14, '才']
    

  • [input().split()] の [ ] は必要です。

  • [['14', '才']] の中の ['14', '才'] を、x, s にアンパック代入しているからです。

  • [ ] が無いと ['14', '才'] を左から順に1つずつ渡すことになり、 変数と値の個数が合わずにエラーとなります。

  • [0] よりも .pop() のほうがわかりやすいかもしれません。

様々な値を任意の型に変換する - リスト内包表記 複数行

複数行にわたる様々な値を任意の型に変換する - リスト内包表記 複数行

    N = int(input())
    lst = [[int(x), s] for _ in range(N) for x, s in [input().split()]]
    
    1
        2
        1 s
        2 t
    
    lst = [[1, 's'], [2, 't']]

    2
        3
        3 か月
        1 才
        8 才
    
    lst = [[3, 'か月'], [1, '才'], [8, '才']]

    3
        4
        1 Gold
        2 Silver
        3 Bronze
        4 Stone
        
    
    lst = [[1, 'Gold'], [2, 'Silver'], [3, 'Bronze'], [4, 'Stone']]

    【 解説 】
    1
        2
        1 s
        2 t
    

    N = int(input())
    lst = [[int(x), s] for _ in range(N) for x, s in [input().split()]]
    
    ↓ N の入力は省略
    N = 2
    lst = [[int(x), s] for _ in range(2) for x, s in [input().split()]]
    
    N = 2
    lst = [[int(x), s] for _ in range(2) for x, s in ['1 s'.split()]]
    
    ↓ (途中省略)
    N = 2
    lst = [[1, 's'] [int(x), s] for _ in range(2) for x='1', s='s' in [['1', 's']]]
    
    ↓ 3行目の読み取り (ループ2回目)
    N = 2
    lst = [[1, 's'] [int(x), s] for _ in range(2) for x, s in ['2 t'.split()]]
    
    ↓ (途中省略)
    N = 2
    lst = [[1, 's'], [2, 't'] [int(x), s] for _ in range(2) for x='2', s='t' in [['2', 't']]]
    
    N = 2
    lst = [[1, 's'], [2, 't']]
    
様々な値を任意の型に変換する - 辞書内包表記

様々な値を任意の型に変換する - 辞書内包表記

    dic = {int(x): s for x, s in [input().split()]}
    
    1
        1 kotetsu
    
    dic = {1: 'kotetsu'}

    2
        2000 g
    
    dic = {2000: 'g'}

    3
        14 才
    
    dic = {14: '才'}

    【 解説 】
    3
        14 才
    

    dic = {int(x), s for x, s in [input().split()]}
    
    dic = {int(x): s for x, s in ['14 才'.split()]}
    
    dic = {int(x): s for x, s in [['14', '才']]}
    
    dic = {int(x): s for x='14', s='才' in [['14', '才']]}
    
    dic = {int('14'): '才' for x='14', s='才' in [['14', '才']]}
    
    dic = {14: '才' for x='14', s='才' in [['14', '才']]}
    
    dic = {14, '才'}
    

  • [input().split()] の [ ] は必要です。

  • [['14', '才']] の中の ['14', '才'] を、x, s にアンパック代入しているからです。

  • [ ] が無いと ['14', '才'] を左から順に1つずつ渡すことになり、 変数と値の個数が合わずにエラーとなります。

様々な値を任意の型に変換する - 辞書内包表記 複数行

複数行にわたる様々な値を任意の型に変換する - 辞書内包表記 複数行

    N = int(input())
    dic = {int(x): s for _ in range(N) for x, s in [input().split()]}
    
    1
        2
        1 s
        2 t
    
    dic = {1: 's', 2: 't'}

    2
        3
        3 か月
        1 才
        8 才
    
    dic = {3: 'か月', 1: '才', 8: '才'}

    3
        4
        1 Gold
        2 Silver
        3 Bronze
        4 Stone
        
    
    dic = {1: 'Gold', 2: 'Silver', 3: 'Bronze', 4: 'Stone'}

    【 解説 】
    1
        2
        1 s
        2 t
    

    N = int(input())
    dic = {int(x): s for _ in range(N) for x, s in [input().split()]}
    
    ↓ N の入力は省略
    N = 2
    dic = {int(x): s for _ in range(2) for x, s in [input().split()]}
    
    N = 2
    dic = {int(x): s for _ in range(2) for x, s in ['1 s'.split()]}
    
    ↓ (途中省略)
    N = 2
    dic = {1: 's' int(x): s for _ in range(2) for x='1', s='s' in [['1', 's']]}
    
    ↓ 3行目の読み取り (ループ2回目)
    N = 2
    dic = {1: 's' int(x): s for _ in range(2) for x, s in ['2 t'.split()]}
    
    ↓ (途中省略)
    N = 2
    dic = {1: 's', 2: 't' int(x): s for _ in range(2) for x='2', s='t' in [['2', 't']]}
    
    N = 2
    dic = {1: 's', 2: 't'}