LoginSignup
ShioShio3300
@ShioShio3300 (栞)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

基本情報技術者試験 令和4年サンプル問題の問4について

基本情報技術者試験 令和4年サンプル問題の問4(https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf) について、for文で1ずつ増やされるiとjの動きが分からない部分があります。

この問題の関数でやりたいことは

{3,0,0,0,0}
{0,2,2,0,0}
{0,0,0,1,3}
{0,0,0,2,0}
{0,0,0,0,1}

という整数型配列の配列(matrix)から0以外の数字を拾い、sparse[1]に拾った数字の行の要素番号、sparse[2]に拾った数字の列の要素番号、sparse[3]に拾った数字そのものを追加して最後に出力するものだと理解しています。

記述されているプログラムにしたがって、for文でiを1から5まで(matrixの行数)、同じくfor文でjを1から5まで(matrixの列数)まで増やしながらトレースしていたのですが、matrix[2][3]の2を拾う時の動きやmatrix[3][5]を拾った後に[4][4]で2を拾う動きが理解できません。

i←1
j←1
Matrix[1][1]≠0Ture
sparse[1]{1,}
sparse[2]{1,}
sparse[3]{3,}

i←2
j←2
Matrix[2][2]≠0Ture
sparse[1]{1,2}
sparse[2]{1,2}
sparse[3]{3,2}

ここまではわかるのですがこのあと
i←3
j←3
Matrix[3][3]≠0Falese

になってしまい
i←2
j←3
というように正解の道筋で処理する理由とやり方が分かりません。

また、同じような理由で、
matrix[3][5]

を通過した後に
matrix[4][4]

を処理するには

j←5

だったものをあとから
j←4

にしなければいけないようにしか見えず、しかしプログラム中に数字を減らす処理があるように見えないように思い、どうしたら解けるのか分からなくなっています。

この問題を解説している動画やサイトを色々閲覧して見たのですが、問題の全てをトレースしているものはなく、どうしたらこのような動きになるのか分からなくなってしまいました。
独学のため的はずれな理解をしている部分があるかもしれません。教えていただけると幸いです。

IPA「基本情報技術者試験 令和4年サンプル問題の問4」 
https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf

0

1Answer

質問者殿は i と j が同時に増えると考えていると見受けられます。

例題の場合 iが1のときに jを1から5まで変化させてmatorixの判断
その後、iが2となり再び jを1から5まで変化させます。
この動作を iが5になるまで実行させるを意図していると考えます。
トレースで言いますと

i←1
j←1
Matrix[1][1]≠0Ture
sparse[1]{1}
sparse[2]{1}
sparse[3]{3}

i←1
j←2
Matrix[1][2]≠0False

i←1
j←3
Matrix[1][3]≠0False

i←1
j←4
Matrix[1][4]≠0False

i←1
j←5
Matrix[1][5]≠0False

i←2
j←1
Matrix[2][1]≠0False

i←2
j←2
Matrix[2][2]≠0True
sparse[1]{1,2}
sparse[2]{1,2}
sparse[3]{3,2}

i←2
j←3
Matrix[2][3]≠0True
sparse[1]{1,2,2}
sparse[2]{1,2,3}
sparse[3]{3,2,2}

i←2
j←4
Matrix[2][4]≠0False

i←2
j←5
Matrix[2][5]≠0False

i←3
j←1
Matrix[3][1]≠0False

i←3
j←2
Matrix[3][2]≠0False

i←3
j←3
Matrix[3][3]≠0False

i←3
j←4
Matrix[3][4]≠0True
sparse[1]{1,2,2,3}
sparse[2]{1,2,3,4}
sparse[3]{3,2,2,1}

i←3
j←5
Matrix[3][5]≠0True
sparse[1]{1,2,2,3,3}
sparse[2]{1,2,3,4,5}
sparse[3]{3,2,2,1,3}

i←4
j←0
Matrix[4][0]≠0False

i←4
j←1
Matrix[4][1]≠0False

i←4
j←2
Matrix[4][2]≠0False

i←4
j←3
Matrix[4][3]≠0False

i←4
j←4
Matrix[4][4]≠0True
sparse[1]{1,2,2,3,3,4}
sparse[2]{1,2,3,4,5,4}
sparse[3]{3,2,2,1,3,2}

i←4
j←5
Matrix[4][5]≠0False

i←5
j←1
Matrix[5][1]≠0False

i←5
j←2
Matrix[5][2]≠0False

i←5
j←3
Matrix[5][3]≠0False

i←5
j←4
Matrix[5][4]≠0False

i←5
j←5
Matrix[5][5]≠0True
sparse[1]{1,2,2,3,3,4,5}
sparse[2]{1,2,3,4,5,4,5}
sparse[3]{3,2,2,1,3,2,1}

を意図していると思います。

1

Comments

  1. @ShioShio3300

    Questioner

    YearCentury様、回答ありがとうございます。
    仰る通り、iとjが同時に増えるものだと勘違いしておりました。
    トレースの例示も大変助かりました。実際に自分でやって見ても同じ結果が出て安心出来ました。
    誠にありがとうございました。

Your answer might help someone💌