🔙
🔝

Cランク実力確認問題セット1

ヒントを頼りにプログラムを組んでみてください。

電話番号

電話番号

print()関数内に直接書く方法

print()関数内に直接書く方法

    入力が3行になっていて、この文字列(数字)と文字列の間にハイフン - をつけて一行にして出力します。入力に使う変数は「入力される値」に、

    A
    B
    C

    とありますので、これをそのまま使ってしまいましょう。

空の文字列に詰め込んでいく方法

空の文字列に詰め込んでいく方法

    空の文字列を予め用意しておいて、そこに入力1行とハイフン - を交互に詰め込んでいく方法です。

    phone_number = ''  # 空の文字列を用意
    

    この場合、最後に余分なハイフンが入ってしまうかもしれません。どのようにして最後だけハイフンを入れないようにするか。

  • 方法1
    文で2行目までを出力し、3行目の処理を別に行う。

  • 方法2
    文の中で文を使い、3行目かどうかの判定を行う。

  • 方法3
    その他ニッチな方法を考える。😼


  • 可能な限り、たくさんの方法3で書いてみてください。😸

.join()メソッドを使う

.join()メソッドを使う

    lst = [input() for _ in range(3)]
    

    この入力方法を使うと、3行の文字列が3つの要素のリストとして作成されます。このリストを print() 関数の () 内で とある方法 で出力すれば、思いの結果が得られます。

リストで入力して展開する

リストで入力して展開する

    lst = [input() for _ in range(3)]
    

    この入力方法を使うと、3行の文字列が3つの要素のリストとして作成されます。このリストを print() 関数の ある方法 で出力すれば、思いの結果が得られます。

気象観測

気象観測

問題文の通りに条件文を書く

問題文の通りに条件文を書く

    雲の割合が、

    • で、0 以上 2 未満
    • で、2 以上 9 未満
    • で、9 以上 10 以下

    このような形で比較式をを書いていって条件文を完成させましょう。

少し簡潔に比較式を書く

少し簡潔に比較式を書く

    雲の割合が、

    • で、2 未満
    • で、2 以上 9 未満
    • で、9 以上

    このような形で比較式をを書いていって条件文を完成させましょう。

もう少し簡潔に条件文を書く

else文に置き換える

    雲の割合が、

    • で、2 未満
    • で、2 以上 9 未満
    • else で、9 以上

    このような形で条件文を書いてみましょう。

荷物検査

荷物検査

入力を順に足していく

入力を順に足していく

    例えば、total という変数を用意してこれを 0 で初期化し、それから入力値を順に total に足していきます。

    最後に M と比較して判定し、結果を画面に出力するという流れを取るという方法です。

入力を順に足していく (途中判定)

入力を順に足していく (途中判定)

    例えば、total という変数を用意してこれを 0 で初期化し、それから入力値を順に total に足していきます。

    入力を受け取って total に足していくごとに M と比較して判定します。M を超えていればこれ以上足しても意味がないので、ループを中断し、結果を出力します。この時、

    • フラグを使って最後に 文で判定する方法
    • else で結果を出力する方法

    おおむねこのどちらかの書き方が思いつくと思います。どちらの方法でも書いてみましょう。😊

入力と同時に全部足してしまう

入力と同時に全部足してしまう

    sum() 関数の () 内に入力を内包表記で書きます。 list() を使った入力の受け取り方を sum() にそのまま置き換えるのです。その結果を変数に代入し、その変数と M を比較して判定を行います。

背の順

背の順

考え方

考え方

    ランクBでも良いくらいの難問ですね。😅 Bランクの入口問題と思って頑張って解いてみましょう。

    どのようにソートするかによって入力の形が変わってきます。この問題で求められている結果は「背の高い順に名前を画面に出力する」ことです。

    最も簡単なのは「二次元リストとして入力する」方法です。入力のしかたは こちら をよく読んで理解してみてください。理解に至れなかった時はとりあえずそれを参考に二次元リストで値を入力してみてください。見様見真似でも作れるはずです。😊



    二次元リストで入力が出来たら、次のような二次元リストになっているはずです。

    A = [[173, 'Hashimoto'], [195, 'Yamamoto'], [113, 'Yoshida']]

    内側のリストの要素0が整数型、要素1が文字列型です。

  • 問題文や条件から考えられること

    • 身長が同じ人はいない
    • 名前が同じ人はいない

    これらは条件の『A_i, S_iは全て相異なる』からわかります。

    背の高い順にソートしますので、整数、つまり要素0を基準にします。この後のソートメソッドや関数を使うと、初めに要素0を基準としてソートされます。ちょうど要素0が身長の値になっていますので、加工せずともこのまま使えますね。😊
    身長が同じ場合は次に要素1の名前でソートされますが、この問題では同じ身長の人はいないことになっていますので考慮する必要はありません。

    自分でソートするプログラムが組めたら素晴らしいですが、ここではラクしてソートメソッドや関数を使って解いてみましょう。😉

.sort()メソッドを使う

.sort()メソッドを使う

    .sort() メソッドは単体で使います。この時、身長が高い順に並び替えますので、ソート順は降順です。

    降順は reverse= を引数に使います。

    .sort() メソッドの使い方は こちら を見て参考にしてください。

sorted()関数を使う

sorted()関数を使う

    sorted() 関数は単体で使うことは出来ません。必ず変数に代入するか、イテラブルとして使います。

    .sorted() 関数の使い方は こちら を見て参考にしてください。

最後に画面に出力する

最後に画面に出力する

    降順ソート後に出来上がった二次元リストの中のリストの一部分、つまり名前だけを画面に表示しますが、 文を使うのが一般的です。

    for height, name in [[195, 'Yamamoto'], [173, 'Hashimoto'], [113, 'Yoshida']]:
    

    こうすると、二次元リストの中のリストが順に heightname に振り分けられていくようになります。

    実際にこの部分をどう書けばよいか、もうわかりますね!👍

他の方法も考える

他の方法も考える

    100点取れたからといってここで満足していてはいけません。他のやり方も考えてみましょう。

  • 身長と名前をそれぞれの一次元リストに分割する

  • 身長リスト: [173, 195, 113]
    名前リスト: ['Hashimoto', 'Yamamoto', 'Yoshida']

    身長リストと名前リストの要素番号を合わせます。二次元リストの中身を縦にしたような形に見えますね。あとは身長リストを使って降順ソートするわけですが・・・・・ソート関数は使えません。身長リストをソートしても、名前リストも連動してソートされるわけではないからです。

    ソート方法は手動です。簡単なバブルソートでも高速にソートできるクイックソートでもお好きな方法でソートしてください。スワップが発生したら、一緒に名前リストの同じ要素番号同士もスワップします。

  • N = 3
    heights = [173, 195, 113]
    names = ['Hashimoto', 'Yamamoto', 'Yoshida']
    
    # 降順バブルソート
    for i in range(N):
        for j in range(N-i-1):
            if heights[j] < heights[j+1]:
                # ↓ 身長と名前を同時にスワップしている ↓
                heights[j], heights[j+1] = heights[j+1], heights[j]
                names[j], names[j+1] = names[j+1], names[j]
    

    めんどくさいので今後この方法を最優先に選択するということは無いでしょうが、しくみを知る、またはこんなやり方でもできるのか〜くらいには感じておくと、いつかどこかでいいことがあるかもしれません。😉

    プログラムで使われるアルゴリズムは、リアルの生活の中でも役に立つことが多いです。当たり前過ぎてこれが当たり前だということにすら気付けないくらい当たり前を目指しましょう。

    Don't think. Feel!

  • リストの代わりに辞書を使う

  • 辞書を使う場合の注意点は、キーが必ず一意でなければなりません。この問題では身長も名前も同じ値は存在しないということが保証されています。よって、身長をキーとしても、名前をキーとしても不具合が起こることはありません。

    身長をキーとすると、ソートが簡単になります。そのままソートメソッドや関数にかけるだけで済みますので。逆に名前をキーとすると途端に難しくなります。

    身長をキーとした場合は、辞書に .items() メソッドを添えてソートすると、ソート後のリストとなって返ってきます。
    名前をキーとした場合は、キーワード引数として key=lambda x:-x[1] が必要になります。lambdaがわからないとわかりませんね。😓

    ※ どちらの方法も返ってきたリストは、正確にはリストではありません。 これをリストとして使うには list() 関数を使ってリストに変換します。これについての詳しい説明はここでは割愛させていただきます。リストではありませんが、イテラブルとして使えますので 文にはそのまま使えます。

    いずれにしても、100点が取れればどの方法でも構わないのですが、プログラミング問題を解いていく本当の目的はそこではありません。

    与えられた値を扱いやすい・管理しやすいデータ形式として受け取って保存し、このデータの形式を利用していく為にいろいろな方法を知る必要があるのです。今回も二次元リスト、辞書、身長と名前を分割した場合とを考えましたが、二次元リストが一番扱いやすく、管理しやすいので二次元リストでの解き方を最初に選びました。しかし今後、辞書で管理する必要が出た場合には辞書でのソートのやり方を知らないと、途端に思考も手も止まってしまいます。いろいろなやり方が考えられますが、そのすべてのやり方を学習するのではなく、どんな時もその場で自力で素早く実現させる為には知識や経験だけでなく、柔軟な思考を持つことが最も重要だと私は思います。方法を知る前にまず自力で考えることはとても大切です。これが出来ない人はプログラミングには向いていないかもしれませんし、実生活においても何をやっても不器用でしょう。正解ではなく、最善ですね。あらゆる方法を試した上で最善を見つける力を養いましょう。慣れれば頭の中だけで最善を見つけられるようになったりならなかっ・・・・・なります!😄

    すっっっごく回りくどい方法を取ったプログラムでも、その中の一部のテクニックが別の所で役立つということがあるかもしれませんし、実際にあったりもします。いきなり正解にこだわらず、最善を求めていろいろたくさん考えまくっていきましょう!それがCランクのうちに身につけておきたい一番のスキルだと思っています。😉