🔙
🔝

【paiza問題集 解説】
Dランクレベルアップメニュー

2 つの数値を出力

2 つの数値を出力

STEP: 1 1 つの文字列を出力

1 つの文字列を出力

  • 例1

  • print('paiza')
    
  • 例2

  • s = 'paiza'
    print(s)
    

    文字列 とは、

    『文字列(もじれつ)は、単語や文章のような、文字の連なったもの。ストリング (英: string)、テキスト (英: text) という場合もある』(Wikipediaより)

    「文字」は1文字を指します。その「文字」が列として連なったものが「文字列」です。

    文字 ・・・ char型
    文字列 ・・・ str型 または string型

    このように文字と文字列は別物なのですが、str型ならば1文字でも「文字列」と呼びます。ややこしいですね。😅 この文章もすべて文字列ということなります。
    「文字」と呼ぶか、「文字列」と呼ぶかは型の違いで分けています。2つの違いに意味はあるのですが、Python3 はほとんどが文字列として扱いますので、char型の存在は忘れても構いません。しかし他の言語では普通にchar型も使いますので、他の言語にも興味がある方は覚えておくとよいです。しかし先ずは Python3 でしっかり基礎を学びましょう。そうすれば他の言語も学びやすくなります。Python3 はプログラミングの基礎学習に最適!

    textと呼んでいたのは遥か昔の話です。文字列のことをテキスト、テキスト型と呼んでいました。


    慣れないうちは例1のように print() の () 内に直接 input() を書いても構いませんが、今後のためにも値は変数に格納して扱うようにしましょう。s は string の頭文字をとった省略形です。

STEP: 2 2 つの文字列を出力

2 つの文字列を出力

  • 例1

  • print('paiza' + ' ' + 'learning')
    
  • 例2

  • print('paiza', 'learning')
    
  • 例3

  • s = 'paiza'
    t = 'learning'
    print(s, t)
    

    例1の書き方が一般的ですが、 print() の機能(?)として、文字列をカンマで区切ると、間に半角スペースが自動で付きます。こういった出力が求められることが非常に多いので、この書き方をするとこうなるということを理解してモノにしておくと後々便利です。

    余談になりますが、文字をくくる記号に ' を使いましたが、" でも構いません。これは例えば、

    s = "The cat said. 'I am a hunyan!'"
    print(s)
    
    The cat said. 'I am a hunyan!'

    s = 'The cat said. "I am a hunyan!"'
    print(s)
    
    The cat said. "I am a hunyan!"

    と、文字列に ' " を使いたいとき、文字列をくくった記号とは別のもう1つの記号の方を文字列内で使うことが出来ます。

STEP: 3 1 行の出力

1 行の出力

  • 例1

  • print(813)
    
  • 例2

  • n = 813
    print(n)
    

    数値を扱います。数値とは 10進数の、

    整数型
    … -1, 0, 1, 2 …
    浮動小数型
    1.0, 2.5, 3.14 など

    主にこの2種類を指します。同じ数値でも、整数型と浮動小数型は別世界です。詳しく説明しませんが、型として分けられている以上、別物なんだなということだけでも覚えておいてください。


    この数値 813 を上記の例のように書くと、画面に 813 と表示されます。

STEP: 4 3 行の出力

3 行の出力

  • 例1

  • print(8)
    print(1)
    print(3)
    
  • 例2

  • n = 8
    m = 1
    k = 3
    print(n)
    print(m)
    print(k)
    
  • 例3

  • nums = [8, 1, 3]
    for n in nums:
        print(num)
    
  • 例4

  • nums = [8, 1, 3]
    print(*num, sep='\n')
    

    他にもまだまだ方法はあります。例3と例4の方法は、今後使いまくります。 [8, 1, 3] の形のものをリストと言います。

    これがどのようなものなのかは 2章 - リスト型 で学習できます。

FINAL問題 2 つの数値を出力

2 つの数値を出力

  • 例1

  • print(str(1) + ' ' + str(1))
    
  • 例2

  • print(1, 1)
    
  • 例3

  • n = 1
    m = 1
    print(n, m)
    
  • 例4

  • n = 1
    print(n, n)
    

    数値 1 を半角スペース区切りで一行出力します。お題を見てください。『2 つの数値を出力』ですよ!よって、


    print('1 1')
    

    という書き方をしてはいけません。これは数値ではなく「数字」を含む文字列です。これでもクリアしてしまいますけどね。😅

    数値は出力する際、 print() 関数が見えないところで数値を文字列に変換してから出力しています。タイミングとしては画面に出力する直前ですので、

    print(1 + ' ' + 1)
    

    という書き方をするとエラーとなります。数値文字列は別の型なので、混在させることはできません。ですので、例1のようにstr型 (文字列型)に変換して文字列型に統一したわけです。

    print() 関数は数値のままでも問題なく画面に出力されます。数値は最終的に文字列に変換してから画面に出力されるからです。

    半角スペースは数値に変換できません。エラーとなります。ですので必然的に文字列である半角スペースに合わせて数値を文字列に変換することになります。型を合わせるのメンドイですけど、そうしないとコンピュータはわからないのですから仕方がありません。

    コンピュータは二次元の世界なので 正誤 があり 反対 です。

    『A が正しく、B は誤りである』

    四次元である現実は相対です。

    『 A が正しいと言えるなら、相対する B もまた正しいと言える』


    コンピュータみたいな思考しかできないヒト、たくさんいますよね?😓 だからといってそういうヒトを「悪い」と決めつけてしまうと、それも二次元思考であり、同じ低次元思考となって争いが起こってしまいます。

    しかしそんな融通の利かないヒトをコンピュータになぞらえれば、こちらが全面的になんとかしなければ動いてくれない、解決しないということは理解に容易いでしょう。きちんと正確に伝えられていないこちらが全面的に「悪い」のです。

    ただ違うのは、コンピュータはこちらの指示を全て聞いてくれます。

    ですのでエラーが出たり、エラーが直らなかったり、思い通りに全然動いてくれなかったとしても、100%こちらが間違っていると理解していれば、あとはひたすら自力で正解を見つけるだけです。コンピュータはいつまでも待っていてくれます。コンピュータは迷惑と感じません。必ず実行し、考える時間を無期限に与えてくれるぶん、ヒト相手と違って楽ちんです。


    今は学習段階。エラーなんかに怯えず怯まず、試行錯誤しまくって作りまくってどんどん動かしまくっていきましょう!1000回エラーを出した頃には、すっかりプログラミング脳となっていること請け合いです。勲章です。祝杯ものです。🍷🎉

代入演算 1

代入演算 1

STEP: 1 足し算

足し算

  • 例1

  • print(1231 + 5178)
    
  • 例2

  • a = 1231 + 5178
    print(a)
    
  • 例3

  • a = 1231
    b = 5178
    print(a + b)
    
  • 例4

  • a = 1231
    a += 5178
    print(a)
    

    コンピュータは計算機なので、計算ができます。

    1章 - 演算子


    問題文には『1,231 と 5,178 の和を出力してください。』と、カンマで区切った形で表記されていますが、カンマは使えません。

    a = 1,231
    b = 5,178
    print(a, b)
    
    (1, 231) (5, 178)

    これは (1231) (5178) の組み合わせを持つデータで、今はまだ意味がわからないと思いますが、 12315178 という数値とは異なります。足し算もできません。このことについては気にせず学習を進めていけば、カンマの意味が自ずとわかってくると思います。

    足し算の場合、数を足していく順番はとくに決まりはありませんが、引き算の場合は順番がありますので注意です。

    5 - 3 = 2
    3 - 5 = -2

    めちゃくちゃ当たり前に思うかもしれませんが、これが変数を使った時に、

  • a = 5
    b = 3

  • a - b = 2
    b - a = -2

  • a = 3
    b = 5

  • a - b = -2
    b - a = 2

    数値が見えていないので間違えやすくなります。結果をすぐに print() で出力すればすぐに確認できて間違いに気付けますが、画面に出力しないと気付くのが難しくなります。「なんでちゃんと動かないんだろう?」と、何時間も画面とにらめっこしたり、考えすぎて夜眠れなくなってしまい得る原因となったりします。いや、ホントに。冗談抜きで。😓

    プログラム例を4つ紹介しましたが、今はどれか1つが理解できればオーケー。👍
    これらの他にも書き方がありますし、今無理に全部を憶えようとしなくて大丈夫です。

STEP: 2 割り算

割り算

    print(437326 // 9085, 437326 % 9085)
    

    プログラムで使う割り算には3つの目的があります。

    // 商を求める
    例)10 // 2 = 5
    % 余りを求める
    例)10 % 2 = 0
    / 割り算の結果を求める (小数点付き)
    例)10 / 2 = 5.0

    特に余りを求める割り算を多用します。学校では余りを切り捨てるなんてことは日常茶飯事でしたが、プログラミングでは余りのほうが重要視されることが多いです。逆に商が切り捨てられます。🤣

    プログラムの世界でも計算順位は、足し算引き算より、掛け算割り算のほうが優先されます。

STEP: 3 累乗

累乗

    A = 202
    B = 134
    C = 107
    
    N = ((A + B) * C) ** 2
    print(N)
    
    1292546304

    累乗は ** という記号を使います。プログラム言語によっては ^ を使いますが、Python3 では ^累乗の演算子としては使えません。

    足し算引き算よりも掛け算割り算を優先して計算しますが、累乗はそれらよりもさらに優先します。

    数学でも () で囲ったところから計算するように優先順位をコントロールしますが、プログラムの場合も同様に、先に計算してほしい所を () で囲います。 初めに () の最深部から、次にその () 内の最も左側から順に計算されていきます。上記プログラム例で示すと (A + B) が最深部、次に (336 * C) が計算され、最後に 35952 ** 2 が計算されます。

    (A + B) * C ** 2 としてしまうと、 (A + B) の次に C ** 2 が計算され、最後に 336 * 11449 という順で計算されてしまいます。

    A = 202
    B = 134
    C = 107
    
    N = (A + B) * C ** 2
    print(N)
    
    3846864

    式が複雑になると () が4重にも5重にもなることがあります。そして () の数が合わないエラーが出た時に、『1、2、1、2、3、2、1、0』と指差し確認しながら () の数を数えるなんて場面をいつしか体験する時がやってくるでしょう。え、さっきやっちゃった?😄

FINAL問題 代入演算 1

代入演算 1

  • 例1

  • N = 0
    N = N + 3286
    N = N * 4736
    N = N % 12312
    
    print(N)
    
  • 例2

  • N = 0
    N += 3286
    N *= 4736
    N %= 12312
    
    print(N)
    

    1つ計算するごとに N に代入していく流れになっています。問題の指示どおりに組めば上記の様になります。なりましたよね?😄

    N = N + 3286
    
    N += 3286
    

    この2つの書き方はそれぞれ同じ結果を返します。もともとは上の N = N + 3286 という書き方をしていたものを、いつしか N += 3286 という省略形が生まれ、現在はこの形の書き方が主流となっています。この += という書き方の記号を代入演算子といいます。


    ただ、この省略形の使い方には注意が必要です。

  • N = 0

  • N = N * 2 + 1

    N = 0 * 2 + 1

    N = 0 + 1

    N = 1

  • N = 0

  • N *= 2 + 1

    N *= 3

    N = N * 3

    N = 0 * 3

    N = 0

    計算順位の違いによって、結果が異なりました。どこで流れが変わるのか、ご自身で流れをよく確認して考えてみてください。腑に落ちるはずです。

半角スペース区切りの 2 つの入力

半角スペース区切りの 2 つの入力

STEP: 1 1 行の入力

1 行の入力

    s = input()
    print(s)
    

    入力される値に『文字列 s が 1 行で与えられます。』とあります。入力された文字列を変数に収め、その変数の値を画面に出力します。用語のオンパレードです。

    変数は何でも良いのですが、s とありますのでこれをそのまま使ってしまいましょう。


    この入力方法に関しては 3章 - 標準入力 にありますので、そちらをカンニングしながら進めてみてください。

STEP: 2 2 行の入力

2 行の入力

    s = input()
    t = input()
    print(s)
    print(t)
    

    st それぞれの変数に入力値を代入して、それぞれを出力します。st の入力順と出力順を間違えないように気をつけてください。😊

    st を逆にしても正しく出力されますが、プログラミング的には誤りです。
    s には s の入力値、t には t の入力値をきちんと代入しましょう。

STEP: 3 1 つの入力

1 つの入力

    s = input()
    print(s)
    

    初めのと何が違うのかわかりにくいですが、意味合いが違うだけでやるべきことは全く同じです。最初のは「1 行の入力」、こちらは「1 つの入力」。 input() 関数ならばどちらも変わりがありません。


    しかし次の問題ではこの違いが重要になります。

FINAL問題 半角スペース区切りの 2 つの入力

半角スペース区切りの 2 つの入力

    s_1, s_2 = input().split()
    print(s_1)
    print(s_2)
    

    単純に input() 関数のみを使うと、半角スペースで区切られた2つの文字列を「1つの文字列」として受け取ってしまいます。

    そこで .split() メソッドというものを使います。この機能は「2章 - 文字列の操作を使いこなす機能一覧」で解説しています。

    メソッドとは・・・・・ 難しすぎるのでここでは説明しませんが😓、 . の後に関数っぽい書き方をすると、その関数の機能が働くオプションです。

    そんな感じで文字列に .split() を付けると、区切り文字で区切られた文字列を指定した区切り文字の所で分割し、リストとなって返ってきますとなりのきゃくはよくかきくうきゃくだ。むずいね。😓

    ですので、上のリンク先の内容と今回の問題を比較して理解してみてください。もし理解できなかったら全部私のせいですごめんなさい。

乗客人数

乗客人数

STEP: 1 入力された 2 つの文字列を出力

入力された 2 つの文字列を出力

    S = input()
    T = input()
    print(S)
    print(T)
    

    何度も同じことをやらされてる感があると思いますが、入力と出力はどの問題でも必ずやることなので、まだまだ続きますし、学習が終わっても続きますよ。😅

STEP: 2 引き算・掛け算

引き算・掛け算

  • 例1

  • A, B = input().split()
    a = int(A)
    b = int(B)
    D = a - b
    P = a * b
    print(D, P)
    
  • 例2

  • A, B = map(int, input().split())
    D = A - B
    P = A * B
    print(D, P)
    

    問題文中の『A と B の差 D』の意味がちょっとわかりにくいですが、出力例を見る限り A - B = D という意味と捉えて良いと思います。

    A と B との差はいくつかと解釈すると、絶対値をとるので結果がマイナスの数になるのはおかしいなと。

    と、こんな感じで捉え方が複数生じる書き方の問題に出くわした場合、条件期待する出力出力例を見て察してください。😅
    それでも極稀に1つに絞りきれない問題もあったりします。その場合は素直に一発100点は諦めましょう。だってしょーがないし。😓


    1行に並ぶ2つの数値の入力方法も、

    3章 - 標準入力

    をご覧ください。

    文字列となっている数となりうる数字を整数に変換する時には int() 関数を使います。文字列全てが数字でなくてはなりません。区切り文字(通常は半角スペース)がある場合は .split() メソッドを使って分割することができます。

STEP: 3 代入演算 2

代入演算 2

    A, B, C = map(int, input().split())
    N = 0
    N += A
    N *= B
    N %= C
    print(N)
    

    先の「代入演算 1」でやったことと同じです。使用する数値が定数から入力値に変わりました。入力方法さえわかれば特に困ったことはなかったのではないかと思われます。

FINAL問題 乗客人数

乗客人数

  • 例1

  • a, b, c = map(int, input().split())
    print(a - b + c)
    
  • 例2

  • a, b, c = map(int, input().split())
    n = a
    n -= b
    n += c
    print(n)
    

    例2はこれまでの流れのとおりに書いたものです。わかりやすさで言えば例1ですね。😅
    でも今は例2が理解できて合格と言えます。

占い

占い

STEP: 2 数値の分岐

数値の分岐

  • 例1

  • N = input()
    if int(N) <= 100:
        print('YES')
    else:
        print('NO')
    
  • 例2

  • N = int(input())
    if N <= 100:
        print('YES')
    else:
        print('NO')
    

    例1と例2の違いは入力した数となりうる文字列を整数に変換している場所です。N を整数として使いたい所で変換しているか、入力と同時に変換しているかです。

    どちらの方法でも構いません。int(N) をたくさん使う場合は例2のように初めから整数に変換しておくとプログラムが楽になり、読みやすくもなります。初めから整数としてしか使わない場合は最初に整数にしておくと、変数に適切な名前を付けやすくもなります。

    <= という記号を比較演算子といいます。比較演算子は、

    演算子

    にて表にしてあります。

STEP: 3 数値演算結果で分岐

数値演算結果で分岐

    A, B, C = map(int, input().split())
    if A * B <= C:
        print('YES')
    else:
        print('NO')
    

    YES の条件は「A × B が C 以下のとき」です。

    NO の条件は、単純に「それ以外のとき」と考えてOKです。ただし一応「A × B が C より大きいときで合ってるよね・・・」と確認のために考えておいたほうが無難です。要件によっては else では不具合が生じる場合もあるのです。

FINAL問題 占い

占い

    n = int(input())
    if n == 7:
        print('Yes')
    else:
        print('No')
    

    総括です。といっても、STEP 1 から書式が変わっていませんので悩むこともなかったでしょう。ただ、出力が YES NO だったのが Yes No に変わりました。コピペで済ませて動作確認せず提出すると致命傷を負います。😂


    条件分岐については、

    1章 - 条件分岐・条件文・条件式・インデント

    で学習できます。これまでに出てこなかったことも書いてありますので、予習のつもりでぜひ読んでみてください。😉

FizzBuzz

FizzBuzz

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

ある数字までの出力 2

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

    ※「ある数字までの出力 1」は、問題集「Cランク獲得 - ループメニュー 1」にあります。

    これは繰り返し文を使う問題ですね。

    1章 - 繰り返し文

    で学習できます。繰り返し文についてはそちらをお読みください。

    1章 - 繰り返し文 を読めばもう解説することもないので、別の方法を紹介します。

  • 文を使った書き方

  • N = int(input())
    i = 1
    while i <= N:
        print(i)
        i += 1
    

    文を使った書き方のほうが何をしているのかがわかりやすいですね。


  • print()関数とrange()関数の組み合わせ技

  • N = int(input())
    print(*range(1, N+1), sep='\n')
    

    これら2つの方法はCランクレベルの書き方なので、今はまだこんな方法でも解けるのかくらいに思ってもらえればそれで構いません。次第に解るようになってきますから焦らなくて大丈夫!👍

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)
    

    FizzBuzz の事前知識が必要です。まずは、

    1章 - アホとイヌ

    で学習してみてください。解説もリンク先に任せます。😅


    条件分岐を増やす を使った問題です。 に関しては、

    1章 - 条件分岐・条件文・条件式・インデント

    で学習できます。

    問題の書き方がとても優しいですね。😊
    与えられた条件の順番のとおりに条件文を書いていけば、自ずと正しい結果が得られるようになっています。

    これにてDランクレベルアップメニューは終了となりますが、これまでのことで理解しきれずにいる部分がありましたら、

    1章 - 入門者向け

    を読破してみてください。気軽に学習できる様、読むだけでなんとなくわかった気になれるくらいの軽い内容となっています。一旦頭を空にしてモバイル端末などからアクセスして、寝転がりながら読んでいってみてください。

    それでも理解に至れなかったときは、きちんと伝えられなかった私に全面非がありますので、遠慮なく私のせいにして次の学習に進んじゃってください。😉


    でも可愛さに免じて許してください。😺