🔙
🔝

【paiza問題集 解説】
ループメニュー1

a ~ z までを表示

a ~ z までを表示

STEP: 1 ある数字までの出力 1

ある数字までの出力 1

  • 例1

  • for i in range(10):
        print(i+1)
    
  • 例2

  • for i in range(1, 11):
        print(i)
    

    range()関数については「1章 繰り返し文」で学習できます。

    例1は、range(10) で 0 〜 9 の範囲のリストをつくります。その先頭の 0 から順にループし、その数 i に 1 を足して 1 〜 10 を画面に出力しています。

    例2は、range()関数の startstop の値を直接指定して 1 〜 10 の範囲のリストをつくり、i をそのまま画面に出力しています。

    また、「ループメニュー」の趣旨とは異なりますが、こんな書き方も出来ます。

    print(*range(1, 11), sep='\n')
    

    ここでは説明しませんが、興味がある方は「2章 見える化ちゃん」を読んでみてください。

STEP: 2 ある数字までの出力 2

ある数字までの出力 2

  • 例1

  • N = int(input())
    for i in range(N):
        print(i+1)
    
  • 例2

  • N = int(input())
    for i in range(1, N+1):
        print(i)
    

    標準入力で N を受け取り、range()関数の stop の所に N を指定します。

    例2では N に 1 を足さないと 1 〜 9 までしか範囲が作られませんので、忘れないように気をつけてください。ちょくちょく忘れますけどね。😅

STEP: 3 数字の受け取り 1

数字の受け取り 1

  • 例1

  • K = list(map(int, input().split()))
    for i in range(10):
        print(K[i])
    
  • 例2

  • K = list(map(int, input().split()))
    for i in K:
        print(i)
    

    一行目の書き方で与えられた数列を一気にリスト化できます。(3章 標準入力 を参照。しゃれイエナンデモナイデス)

    受け取った数列 K を例2の様に書くこともできます。

STEP: 4 数字の受け取り 2

数字の受け取り 2

  • 例1

  • N = int(input())
    K = list(map(int, input().split()))
    for i in range(N):
        print(K[i])
    
  • 例2

  • N = int(input())
    K = list(map(int, input().split()))
    for i in K:
        print(i)
    

    これまでの解答の合わせ技です。
    例2では一行目で N を受け取りますが、以降 N を使うことがありません。そんなときは、

    _ = input()
    

    と、N_ にしておくと「この入力は以降使うことはありません」、つまりダミーということがわかるようになります。

    input()
    

    としても正しく動きますが、ゴミと勘違いされかねないので気をつけてください。

STEP: 5 ある数をある回数表示 1

ある数をある回数表示 1

    for _ in range(8):
        print(3)
    

    _ ではなく i でもよいのですが、i は以降使いませんので、ここは _ としておきます。

    _ (アンダースコア) の意味については「3章 補足」で学習できます。

STEP: 6 ある数をある回数表示 2

ある数をある回数表示 2

    N, K = map(int, input().split())
    for _ in range(K):
        print(N)
    

    単純に「K 回ループする」という場合は二行目の書き方にするとよいです。

    _ (アンダースコア) の意味については「3章 補足」で学習できます。

FINAL問題 a ~ z までを表示

a ~ z までを表示

    s = 'abcdefghijklmnopqrstuvwxyz'
    for c in s:
        print(c)
    

    リストだけでなく、文字列でもループに使えます。ただこの書き方では、処理に使うアルファベットを準備する為に a から z まで順に手打ちしていかなければなりません。

    便利な関数があります。

    lst = [chr(i+97) for i in range(26)]
    for c in lst:
        print(c)
    

    unicode と呼ばれる文字コード表があるのですが、chr()関数は、文字コードを対応する文字に変換してくれる機能です。97 というのは、文字 a に対応する文字コードです。
    range(26)26 はアルファベットの文字数、0 〜 25 に 97 を順に足していくことで a 〜 z を一気に作り出しています。

    反対に、文字を文字コードに変換するord()関数というものもあります。これを使うと文字コードがわからなくても、ord('a') と書けば 97 に変換してくれます。

    lst = [chr(i + ord('a')) for i in range(26)]
    for c in lst:
        print(c)
    

    こちらのほうがわかりやすいですね。もちろん ord('A') とすれば、A の文字コードがわからなくても A 〜 Z を作り出してくれます。便利!

数列同士の引き算

数列同士の引き算

STEP: 1 数列の和

数列の和

  • 例1

  • _ = input()
    a = list(map(int, input().split()))
    print(sum(a))
    
  • 例2

  • N = int(input())
    a = list(map(int, input().split()))
    sum_ = 0
    for i in range(N):
        sum_ += a[i]
    
        print(sum_)
    
  • 例3

  • _ = input()
    a = list(map(int, input().split()))
    sum_ = 0
    for i in a:
        sum_ += a
    
        print(sum_)
    

    例1のsum()関数は、引数に与えた数値を合計して返す機能です。この引数に数値のデータを与えると一気に合計してくれます。

    ただ、ここは「ループメニュー」なので繰り返し文を使って解きます。

    例2と例3は、リスト a の先頭の数から1つずつ順に sum_ と足していきます。全ての処理を終えた時の sum_ の値が合計値となるので、それを画面に出力して完了です。

    a = [8, 1, 3, 8, 1, 3] の時

    a 8 1 3 8 1 3
    sum_ += a 0 8 9 12 20 21 24
STEP: 2 数列の A 番目から B 番目までの和

数列の A 番目から B 番目までの和

    N, A, B = map(int, input().split())
    a = list(map(int, input().split()))
    
    sum_ = 0
    for i in range(A-1, B):
        sum_ += a[i]
        
    print(sum_)
    

    range()関数に範囲を指定するだけです。
    1番目とは要素番号 0 のことですので、A から 1 を引く必要があります。B はそのままで大丈夫です。

STEP: 3 数列の値を全部 * 2 して出力

STEP: 3 数列の値を全部 * 2 して出力

  • 例1

  • N = int(input())
    a = list(map(int, input().split()))
    for i in range(N):
        print(a[i] * 2)
    
  • 例2

  • _ = input()
    a = list(map(int, input().split()))
    for i in a:
        print(i*2)
    
  • 例3

  • _ = input()
    a = [int(i) * 2 for i in input().split()]
    print(*a, sep='\n')
    

    お好みでどうぞ!😸

FINAL問題 数列同士の引き算

FINAL問題 数列同士の引き算

  • 例1

  • N = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    
    for i in range(N):
        print(a[i] - b[i])
    
  • 例2

  • N = int(input())
    a = list(map(int, input().split()))
    b = list(map(int, input().split()))
    
    for i, j in zip(a, b):
        print(i - j)
    

    数列が1つ増えただけで、range()関数を使えばもう楽勝ですね。😽

    例2のzip()の使い方は「2章 見える化ちゃん 2期」で軽く説明しています。

FizzBuzz

FizzBuzz

STEP: 1 数列の反転

数列の反転

  • 例1

  • _ = input()
    a = list(map(int, input().split()))
    
    for i in reversed(a):
        print(i)
    
  • 例2

  • _ = input()
    a = list(map(int, input().split()))
    
    for i in a[::-1]:
        print(i)
    

    リストの反転方法は2つあります。
    1つは例1のreversed()関数を使う方法です。reversed()の引数に反転したいリストを与えるだけですが、この関数はprint()で中身を見ると、

    print(reversed(a))
    
    <list_reverseiterator object at 0x153c4ccb40d0>

    と、ワケのわからないことを言ってきます。放っておいたらヤバそうです。
    これは「2章 見える化ちゃん 2期」で説明しています。

    例2はスライスで [::-1] と書くとリストが反転します。こちらはprint()で中身を見ることが出来ます。

STEP: 2 九九の表示 1

STEP: 2 九九の表示 1

  • 例1

  • a = []
    for i in range(1, 10):
        a.append(i*8)
    
    print(*a)
    
  • 例2

  • a = [i*8 for i in range(1, 10)]
    print(*a)
    

    この出力方法を知らないとフツーにめんどくさいので、このprint()の書き方と、ついでに例2の内包表記もわかるとラクです。

    print()の書き方は「2章 見える化ちゃん」で学べます。
    内包表記は「2章 内包表記」で学べますが、難しくてよくわからない場合はとりあえず例2がわかるくらいでも構いませんし、わからなくてもまだ大丈夫です。👍

STEP: 3 九九の表示 2

九九の表示 2

  • 例1

  • N = int(input())
    
    a = []
    for i in range(1, 10):
        a.append(N * i)
    
    print(*a)
    
  • 例2

  • N = int(input())
    a = [N * i for i in range(1, 10)]
    print(*a)
    

    8 が N になっただけですので、解説は1つ前の「STEP: 2 九九の表示 1」を見て参考にしてください。

STEP: 4 2 の累乗を表示

2 の累乗を表示

  • 例1

  • N = int(input())
    for i in range(1, N+1):
        print(2**i)
    
  • 例2

  • N = int(input())
    for i in range(N):
        print(2**(i+1))
    
  • 例3

  • N = int(input())
    for i in range(1, N+1):
        print(pow(2, i))
    

    累乗(べき乗)は ** という記号を使います。例1はそのままの書き方なのですが、例2は計算時に i に 1 を足しています。i+1 に () を付けるのは、足し算よりも累乗のほうが優先順位が高いので、先に i+1 を計算しないと誤った答えになってしまうからです。

    i = 2 の時
    2**(i+1) = 2i+1 = 22+1 = 23 = 8
    2**i+1 = 2i+1 = 22+1 = 4+1 = 5

    例3では累乗を求めるpow()という関数を使っています。これで 2i乗という意味です。

FINAL問題 FizzBuzz

FizzBuzz

    for i in range(1, 101):
        if i % 3 == 0 and i % 5 == 0:
            print('FizzBuzz')
        elif i % 3 == 0:
            print('Fizz')
        elif i % 5 == 0:
            print('Buzz')
        else:
            print(i)
    

    この問題は の両方がわからないと解けません。
    解説はすべて「1章 アホとイヌ」に丸投げ同じことが書かれています。

    この問題の書き方がとても親切ですね。😺

数列の中に何個ある?

数列の中に何個ある?

STEP: 1 数列の最大値

数列の最大値

  • 例1

  • _ = input()
    a = list(map(int, input().split()))
    print(max(a))
    
  • 例2

  • _ = input()
    a = list(map(int, input().split()))
    
    max_ = -float('inf')
    for i in a:
        if i > max_:
            max_ = i
    
    print(max_)
    

    例1が最も簡単な書き方ですが、ここは「ループメニュー」なので繰り返し文を使って解いてみます。

    a = [1, 5, 4, 3, 2] の時

    i 1 5 4 3 2
    max_ -∞ 1 5 5 5 5

    imax_ を比較し、imax_ より大きかったら max_i に更新します。最後に max_ を画面に出力したら完了です。

    max_ の初期値を、最小値の -float('inf') −∞ (マイナス無限) にしてあります。条件を見ると 0 〜 100 となっているので max_ = 0 としてもよいのですが、max_ = -float('inf') とすれば −∞ より小さな値が登場することは有り得ませんので、このほうが確実でなによりどんな条件でも使えてラクです。ついでに憶えてしまいましょう。

    もひとつついでにこんな書き方も出来ます。

    _ = input()
    a = list(map(int, input().split()))
    
    max_ = -float('inf')
    for i in a:
        max_ = max(max_, i)   # ← ココ
    
    print(max_)
    

    max()関数の引数をカンマで区切ると、複数の値から最大値を取得します。
    この例では、max_i を比較して、大きい方を max_ に代入します。

    この書き方のほうが一般的なので、どんどん使っていきましょう!👍

    max()関数は「2章 リスト型データを使いこなす機能一覧」で学習できます。

STEP: 2 数列の最小値

数列の最小値

  • 例1

  • _ = input()
    a = list(map(int, input().split()))
    print(min(a))
    
  • 例2

  • _ = input()
    a = list(map(int, input().split()))
    
    min_ = float('inf')
    for i in a:
        if i < max_:
            max_ = i
    
    print(max_)
    

    1つ前の「数列の最大値」と比較し、例1では今度はmin()関数を使います。

    例2では、それぞれ「最大値」と「最小値」が逆になります。最小値の初期値が float('int') ∞ (無限) となり、文の imax_ を比較する不等号も逆になります。

    これもまた、

    min_ = min(min_, i)
    

    という書き方が出来ます。max()min() はセットで憶えてしまいましょう!😼

    min()関数は「2章 リスト型データを使いこなす機能一覧」で学習できます。

STEP: 3 数列の何番目にある?

数列の何番目にある?

  • 例1

  • _ = int(input())
    a = list(map(int, input().split()))
    print(a.index(1) + 1)
    
  • 例2

  • N = int(input())
    a = list(map(int, input().split()))
    
    for i in range(N):
        if a[i] == 1:
            print(i+1)
    

    例1の書き方も出来ますが、ここは「ループメニュー」なので繰り返し文を使って解いてみます。

    例2は 数列a の先頭から1つずつ 1 を探し、見つけたらその要素 i+1 を出力します。問題文に、数列の1つ目の要素が1番目とありますので、i に 1 を足します。

    もう2つ、プログラム例を紹介します。

  • 例3

  • _ = input()
    a = list(map(int, input().split()))
    
    i = 0
    while a[i] != 1:
        i += 1
    
    print(i+1)
    

    の条件式を に移しました。その代わり i のカウントを自分で回さないといけなくなります。

  • 例4

  • _ = input()
    a = list(map(int, input().split()))
    
    for i, n in enumerate(a):
        if n == 1:
            print(i+1)
    

    enumerate()関数は「2章 リスト型データを使いこなす機能一覧」で学べます。

FINAL問題 数列の中に何個ある?

数列の中に何個ある?

  • 例1

  • _ = int(input())
    a = list(map(int, input().split()))
    print(a.count(1))
    
  • 例2

  • N = int(input())
    a = list(map(int, input().split()))
    
    cnt = 0
    for i in range(N):
        if a[i] == 1:
            cnt += 1
    
    print(cnt)
    

    例1の書き方も出来ますが、ここは「ループメニュー」なので繰り返し文を使って解いてみます。

    例2ではまず cnt の値を 0 に初期化します。その後、数列a の先頭から 1 を探し、見つけたら cnt に 1 を足します。最後まで調べ終えてループを抜けたら、 cnt の値を画面に出力して完了となります。