アルゴリズムとプログラミングの練習問題

出題領域「アルゴリズムとプログラミング」の練習問題 14 問です。公式の出題率は 35% です。

問題 1

次のコードの出力はどれか。

fruits = ["apple", "banana", "cherry", "melon"]
print(fruits[1:3])
  1. 1['apple', 'banana', 'cherry']
  2. 2['banana', 'cherry']
  3. 3['banana', 'cherry', 'melon']
  4. 4['cherry', 'melon']
答えと解説を見る

正解:2. ['banana', 'cherry']

解説

リストのスライス fruits[1:3] は、インデックス 1 から 2 まで(終了の 3 は含まない)の要素を新しいリストとして取り出します。インデックスは 0 から始まるので、インデックス 1 は "banana"、インデックス 2 は "cherry" です。「開始は含む、終了は含まない」というルールは range() と共通の、Python の重要な約束事です。

問題 2

次のコードの出力はどれか。

animals = ["dog", "cat", "bird"]
print("cat" in animals)
  1. 1True
  2. 2False
  3. 31
  4. 4cat
答えと解説を見る

正解:1. True

解説

in 演算子は、指定した要素がリストなどに含まれているかどうかを調べ、含まれていれば True、含まれていなければ False を返します。"cat" はリスト animals に含まれているので True と表示されます。in は if 文の条件としてもよく使われ、「リストの中にあるかどうかで処理を分ける」といった場面で活躍します。

問題 3

次のコードの出力はどれか。

print("Py" * 3)
  1. 1Py3
  2. 2PyPyPy
  3. 3Py Py Py
  4. 4エラー
答えと解説を見る

正解:2. PyPyPy

解説

文字列に整数を掛けると、その文字列を指定した回数だけ繰り返した新しい文字列が作られます。"Py" * 3 は "Py" を 3 回繰り返した "PyPyPy" になります。間にスペースは入りません。区切り線を print("-" * 20) のように作るなど、繰り返しの記号を出力したいときに便利な書き方です。

問題 4

次のコードの出力はどれか。

scores = {"math": 80}
scores["english"] = 90
print(len(scores))
  1. 11
  2. 22
  3. 390
  4. 4エラー
答えと解説を見る

正解:2. 2

解説

辞書に scores["english"] = 90 のように新しいキーを指定して代入すると、そのキーと値のペアが辞書に追加されます。もともと "math" の 1 件だった辞書に "english" が加わり、len(scores) はキーの個数である 2 を返します。既存のキーに代入した場合は追加ではなく値の上書きになる点も、あわせて覚えておきましょう。

問題 5

ソート済みの 1,024 件の会員名簿から、二分探索で特定の会員を探す。1 回比較を行うごとに、探索の対象範囲はどうなるか。

  1. 11 件ずつ減る
  2. 2約半分になる
  3. 3約 2 倍になる
  4. 4変わらない
答えと解説を見る

正解:2. 約半分になる

解説

二分探索は、探索範囲の中央の要素と比較し、目的の値が中央より小さければ前半分、大きければ後ろ半分に絞り込む方法です。そのため 1 回比較するごとに探索範囲は約半分になります。1,024 件でも 512 → 256 → 128 →… と急速に絞り込まれ、わずか 10 回ほどの比較で見つけられます。先頭から 1 件ずつ調べる線形探索と比べて、データが多いほど圧倒的に速くなります。

問題 6

「隣り合う 2 つの要素を比較し、順序が逆であれば交換する。これをくり返してデータ全体を並べ替える」という説明にあてはまるアルゴリズムはどれか。

  1. 1二分探索
  2. 2バブルソート
  3. 3モンテカルロ法
  4. 4線形探索
答えと解説を見る

正解:2. バブルソート

解説

隣り合う要素の比較と交換をくり返して並べ替えるアルゴリズムは「バブルソート」です。小さい(または大きい)値が泡(バブル)のように端へ浮かび上がっていく様子からこの名前がついています。仕組みが分かりやすいためアルゴリズム学習の入り口としてよく登場しますが、データが多いと比較回数が急増するため、実用では他の高速なソートが使われることが多いです。二分探索と線形探索は「探す」アルゴリズム、モンテカルロ法は乱数を使って値を推定する方法です。

問題 7

プリンタの印刷待ちのように、「先に登録されたものから順に取り出される」データの管理方法を何と呼ぶか。

  1. 1スタック
  2. 2キュー
  3. 3変数
  4. 4関数
答えと解説を見る

正解:2. キュー

解説

先に入れたものから順に取り出す(FIFO: First In First Out, 先入れ先出し)データの管理方法を「キュー」と呼びます。プリンタの印刷待ちやレジの行列のように、「並んだ順に処理される」場面のモデルとして使われます。反対に、後に入れたものから先に取り出す(LIFO)方法はスタックと呼ばれ、ブラウザの「戻る」機能などに使われています。両者の違いは「取り出す順序」にあります。

問題 8

次のコードを実行するとどうなるか。

def calc():
    result = 10

calc()
print(result)
  1. 110 と表示される
  2. 20 と表示される
  3. 3エラーになる
  4. 4何も表示されない
答えと解説を見る

正解:3. エラーになる

解説

関数の中で作った変数(ローカル変数)は、その関数の中でしか使えません。result は関数 calc の中で定義されているため、関数の外にある print(result) の時点では存在せず、NameError というエラーになります。関数の外で計算結果を使いたい場合は、return result で値を返し、answer = calc() のように受け取るのが正しい書き方です。

問題 9

次のコードで、名前は何回表示されるか。

members = ["ami", "ken", "yui", "sho"]

for name in members:
    if name == "yui":
        break
    print(name)
  1. 11 回
  2. 22 回
  3. 33 回
  4. 44 回
答えと解説を見る

正解:2. 2 回

解説

break はループをその場で終了させる命令です。このコードでは "ami"、"ken" が表示された後、"yui" のときに if 文の条件が真になり、print が実行される前に break でループを抜けます。そのため表示されるのは 2 回です。break は「探しものが見つかったらそれ以上くり返さない」といった、無駄な処理を省く場面でよく使われます。

問題 10

x に 7 が代入されているとき、式 x > 5 and x < 10 の値はどれか。

  1. 1True
  2. 2False
  3. 37
  4. 4エラー
答えと解説を見る

正解:1. True

解説

and は「両方の条件が真のときだけ全体が真になる」論理演算子です。x が 7 のとき、x > 5 は True、x < 10 も True なので、全体の値は True になります。数学の「5 < x < 10」のような範囲の条件をプログラムで書くときによく使う形です。どちらか一方でも偽なら結果は False になります。ちなみに「どちらか一方でも真なら真」としたい場合は or を使います。

問題 11

次のコードの出力はどれか。

print(7 % 3)
  1. 11
  2. 22
  3. 32.333...
  4. 421
答えと解説を見る

正解:1. 1

解説

% は割り算の余り(剰余)を求める演算子です。7 を 3 で割ると商が 2 で余りが 1 なので、7 % 3 は 1 になります。割り算の結果そのものは /(7 / 3 = 2.333...)、小数点以下を切り捨てた商は //(7 // 3 = 2)で求められます。余りの計算は「偶数か奇数かの判定」や「n 回ごとに処理を変える」といった場面で頻繁に使われます。

問題 12

input() を使ってユーザーが入力した数に 3 を足して表示したい。正しい説明はどれか。

  1. 1input() の結果は整数なので、そのまま 3 を足せる
  2. 2input() の結果は文字列なので、int() で整数に変換してから 3 を足す
  3. 3input() は数字の入力を受け付けないので、この処理は実現できない
  4. 4input() の結果に 3 を足すと、自動的に文字列の "3" が連結される
答えと解説を見る

正解:2. input() の結果は文字列なので、int() で整数に変換してから 3 を足す

解説

input() は、ユーザーが入力した内容を常に文字列として返します。たとえば 5 と入力しても、返ってくるのは文字列の "5" です。文字列と整数はそのまま足し算できずエラーになるため、int(input()) のように int() で整数へ変換してから計算します。数字の入力自体は受け付けられますし、文字列と整数を + でつないでも自動的に連結はされず TypeError になります。「入力は文字列で返る」は、初心者がつまずきやすい重要ポイントです。

問題 13

アルゴリズムを構成する 3 つの基本構造の組み合わせとして正しいものはどれか。

  1. 1順次・分岐・反復
  2. 2入力・出力・保存
  3. 3加算・減算・乗算
  4. 4変数・関数・ライブラリ
答えと解説を見る

正解:1. 順次・分岐・反復

解説

どんなに複雑なアルゴリズムも、「順次(上から順に実行する)」「分岐(条件によって処理を選ぶ)」「反復(処理をくり返す)」という 3 つの基本構造の組み合わせで表現できます。Python では、順次は文を上から並べること、分岐は if 文、反復は for 文や while 文に対応します。フローチャートでアルゴリズムを表すときも、この 3 構造が基本の部品になります。

問題 14

次のコードを実行するとどうなるか。

print(10 / 0)
  1. 10 と表示される
  2. 210 と表示される
  3. 3無限大と表示される
  4. 4エラーになる
答えと解説を見る

正解:4. エラーになる

解説

数学と同じように、プログラムでも 0 で割ることはできません。Python で 0 による割り算を実行すると ZeroDivisionError というエラーが発生し、プログラムはそこで停止します。ユーザーの入力値で割り算をするプログラムでは、割る数が 0 でないかを if 文で確認したり、エラー処理(try-except)を使ったりして、0 除算が起きないように備えることが大切です。