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 は・・・といった具合です。
面倒ですが、丁寧にパターン化して順番に解くのがベストだと思います。
おわり!
何かあればげるすらに答えられることであれば答えます。
ゆるふぁい!
この記事が気に入ったらサポートをしてみませんか?