ITパスポート 疑似言語

今日のりあらさんの配信で出てきたITパスポートの疑似言語の
処理の流れを説明します。




問題文

〇printArray()
    整数: n, m
    整数型の配列: integerArray ← {2, 4, 1, 3}
    for (n を 1 から (integerArray の要素数 - 1) まで1ずつ増やす)
        for (m を 1 から (integerArray の要素数 - 1) まで1ずつ増やす)
            if (integerArray[m] > integerArray[m + 1])
                integerArray[m] と integerArray[m + 1] の値を入れ替える
            endif
        endfor
    endfor
    integerArrayの全ての要素 を先頭から順にコンマ区切りで出力する

ポイント

この疑似言語の処理ポイントは基本的に二つだけです。

  • 一つ目のループ処理が進むにつれて、二つ目のループ処理の回数が減る。

  • 配列の左に小さい数字、右に大きい数字を寄せる。


出力から処理の流れを考える。

わかりやすくするために、integerArrayを仮に
integerArray = {4, 3, 2, 1}
だとして処理を追ってみましょう。
前提として、
for (n を 1 から (integerArray の要素数 - 1) まで1ずつ増やす)
なので、n の範囲は
n = 1~3
であることをしっかりおさえましょう。


n = 1 の時の処理・・・

mの範囲は、 m = 1~(4 - n) = 1~3なので、
m が 1, 2, 3 の時の3回処理を実行します。

m = 1 の時、
integerArray[m] = integerArray[1] = 4
integerArray[m + 1] = integerArray[2] = 3
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {3, 4, 2, 1} となります。

m = 2 の時、
integerArray[m] = integerArray[2] = 4
integerArray[m + 1] = integerArray[3] = 2
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {3, 2, 4, 1} となります。

m = 3 の時、
integerArray[m] = integerArray[3] = 4
integerArray[m + 1] = integerArray[4] = 1
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {3, 2, 1, 4} となります。


n = 2 の時の処理・・・

現状、integerArrayの内容は以下の通り。
integerArray = {3, 2, 1, 4}
mの範囲は、 m = 1~(4 - n) = 1~2なので、
m が 1, 2 の時の2回処理を実行します。

m = 1 の時、
integerArray[m] = integerArray[1] = 3
integerArray[m + 1] = integerArray[2] = 2
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {2, 3, 1, 4} となります。

m = 2 の時、
integerArray[m] = integerArray[2] = 3
integerArray[m + 1] = integerArray[3] = 1
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {2, 1, 3, 4} となります。


n = 3 の時の処理・・・

現状、integerArrayの内容は以下の通り。
integerArray = {2, 1, 3, 4}
mの範囲は、 m = 1~(4 - n) = 1~1なので、
m が 1 の時の1回処理を実行します。

m = 1 の時、
integerArray[m] = integerArray[1] = 3
integerArray[m + 1] = integerArray[2] = 2
なので、integerArray[m] > integerArray[m + 1] が成立しますので、
integerArray[m] と integerArray[m + 1] を入れ替えます。
integerArray = {1, 2, 3, 4} となります。


なので、
integerArray = {4, 3, 2, 1}
の時の答えは、
1, 2, 3, 4
となります。


処理結果の移り変わり

n =1, m = 1~3 の処理
m = 1 の時、 {4, 3, 2, 1} ⇒ {3, 4, 2, 1}
m = 2 の時、 {3, 4, 2, 1} ⇒ {3, 2, 4, 1}
m = 3 の時、 {3, 2, 4, 1} ⇒ {3, 2, 1, 4}

n = 2, m = 1~2 の処理
m = 1 の時、 {3, 2, 1, 4} ⇒ {2, 3, 1, 4}
m = 2 の時、 {2, 3, 1, 4} ⇒ {2, 1, 3, 4}

n = 3, m = 1~1の処理
m = 1 の時、 {2, 1, 3, 4} ⇒ {1, 2, 3, 4}

となります。
わかった方もいるかもしれませんが、これは「ソート」を実行しています。
m = 1~(4 - n) の範囲でとにかく大きい数字を右端に寄せれば、
左から順番に数字が大きくなる配列に変換できるのです。


問題文の配列だとどうなる?

先ほどは処理の流れが追いやすいような配列で考えました。
今度は、問題文の通りの配列
integerArray = {2, 4, 1, 3}
で追ってみましょう。
n = 1~3
m = 1~(4 - n)

は変わりません。


n = 1, m = 1~3 の処理

m = 1 の時・・・
integerArray[1] = 2
integerArray[2] = 4

なので、integerArray[m] > integerArray[m + 1] が成立しませんので、
値の入れ替えは実行されません
したがって、
{2, 4, 1, 3} ⇒ {2, 4, 1, 3}
となります。

m = 2 の時・・・
4 と 1 で条件が成立するので、入れ替えを実行します。
{2, 4, 1, 3} ⇒ {2, 1, 4, 3}

m = 3 の時・・・
4 と 3 で条件が成立するので、入れ替えを実行します。
{2, 1, 4, 3} ⇒ {2, 1, 3, 4}


n = 2, m = 1~2 の処理

m = 1 の時・・・
2 と 1 で条件が成立するので、入れ替えを実行します。
{2, 1, 3, 4} ⇒ {1, 2, 3, 4}

m = 2 の時・・・
2 と 3 で条件が成立しないので、入れ替えを実行しません
{1, 2, 3, 4} ⇒ {1, 2, 3, 4}


n = 3, m = 1~1 の処理

m = 1 の時・・・
1 と 2 で条件が成立しないので、入れ替えを実行しません
{1, 2, 3, 4} ⇒ {1, 2, 3, 4}


処理結果

以上で処理終了なので、答えは
1, 2, 3, 4
となります。


処理結果の移り変わり

n =1, m = 1~3 の処理
m = 1 の時、 {2, 4, 1, 3} ⇒ {2, 4, 1, 3}
m = 2 の時、 {2, 4, 1, 3} ⇒ {2, 1, 4, 3}
m = 3 の時、 {2, 1, 4, 3} ⇒ {2, 1, 3, 4}

n = 2, m = 1~2 の処理
m = 1 の時、 {2, 1, 3, 4} ⇒ {1, 2, 3, 4}
m = 2 の時、 {1, 2, 3, 4} ⇒ {1, 2, 3, 4}

n = 3, m = 1~1の処理
m = 1 の時、 {1, 2, 3, 4} ⇒ {1, 2, 3, 4}


Pythonで書いてみる。

def print_array():
    # integer_array = [2, 4, 1, 3] #問題の配列
    integer_array = [4, 3, 2, 1]
    for n in range(len(integer_array)): #問題では1~4-1まで3回処理を実行する。 Pythonでは0~3-1まで実行する。
        for m in range(len(integer_array) - (n+1)): #問題では1~4-nまで処理を実行する。 Pythonでは0~3-(n+1)まで実行する。
            if integer_array[m] > integer_array[m+1]: #もしinteger_arrayのm番目の数がm+1番目の数字より小さければ・・・
                integer_array[m], integer_array[m+1] = integer_array[m+1], integer_array[m] #m番目の数とm+1番目の数を入れ替える
    return integer_array


if __name__ == '__main__':
    print(print_array())

興味がある方は疑似言語をPython等で記述してみるのも理解が深まっていいかもしれませんね!
コードが書けたら疑似言語は解けますので。


コツ?

今回のように多重ループ処理を考えるうえで大切なのは、
しっかりと場合分けを行うことです。
数学みたいなもんです笑

n = 1 の場合、m は・・・ n = 2 の場合、m は・・・といった具合です。
面倒ですが、丁寧にパターン化して順番に解くのがベストだと思います。


おわり!

何かあればげるすらに答えられることであれば答えます。
ゆるふぁい!

この記事が気に入ったらサポートをしてみませんか?