見出し画像

基本情報技術者試験の2次元配列はいやらしい(備忘録)

議事言語のトレースは初学者の心をバキバキにへし折る


基本情報技術者試験は2023年度より、旧午後問題が科目Bという区分になり、8割の問題が議事言語となった。

議事言語の問題はとにかく練習が大事といわれていて、初学者はとにかくプログラムを1行ずつ読み解いて処理結果を追う練習をせよ、トレース表を作れというのがyoutuberや各参考書籍の主張である。

だが、私のような初学者というか、抽象思考アレルギーのある人間(議事言語はjavaなどの具体的なプログラミング言語を使わないので抽象的思考力が必要)からすると、そもそもその練習に至るまでの過程で挫折を味わうこととなる。代入をするな、最初から具体的にかけ。(無理)

なぜなら、自分なりに考えてみても、参考書籍のような「きれいなトレース表」を作ることはできず、殴り書きのような謎の芸術作品が出来上がってしまうからである。

自分で見返しても何が書いてあるのかわからない。もはや暗号である。
そして、理想と現実のギャップが大きく「もういいや。無理」となってしまう。
つまり「トレース表」を作るということ自体が、ITのセンスが問われる作業であるのだ。

このセンス自体は何度も問題を解いて、自力で磨いていくしかないといわれている。
だから、先輩方は質問しても、丁寧にコツを教えてくれない。
自分で気づかないと意味がない、と考えているからである。

それは一理ある。
たしかに、練習を重ねていくにつれ、自分なりの「トレース表」を作ることができるようになっていく。

が、できるようになるか半ば運ゲーなのではないかと思う。
ひらめきというか、気づけるかどうかというか。

運悪く解法をひらめかず、心が折れて、今後何十万人も不足するといわれているIT人材が学習を投げ出してしまうのは非常にもったいないことである。

例えば、次の「2次元配列」に関するプログラムの実行結果を問う問題に関していえば、私の心をギタギタに蹂躙し、仕事を辞めてやろうかと思わせるには十分ないやらしさがあった。(私が根性なしなのでは決してないのである。断じて。

だから、この苦行をおもしろおかしく、かつインプットのみならずアウトプットをかねて、学習の際に気づいた点を発信していこうと決めた。

私の思考の垂れ流しが少しでも誰かの役に立ったらいいなと夢想する。

誤った解釈や説明があればコメントで誹謗中傷にならない程度に指摘してほしい。

2次元配列の問題は前提をミスると死ぬ

タイトルのとおりである。
この問題は「関数transformSparseMatrix」の引数matrixとして2次元配列のデータをインプットして、アウトプットとしてはデータ構造が変換された配列がSparseMatrixの変数に格納され、出力される。

何言っているか分からない人はまずは変数とか配列について勉強してほしい。(さんざん言ったのにここは丸投げをするのである。ゆるせ。)

https://www.ipa.go.jp/shiken/syllabus/ps6vr7000000oett-att/fe_kamoku_b_sample.pdf

この問題は単純にプログラムの実行結果を追っていけば、変数SparseMatrixの中に何が格納されるのかが分かるというものである。

よってトレース表を作ればすむのだが、このトレース表を紙に書き起こすとなるとけっこうな量で、大変なのである。

なので、2次元配列の場合、トレース表の書き方を間違えていると、時間をかけて問題を解いたのに不正解、という悲しい結果となる。

次の画像は、引数matrixの値を図示したものである。
私がやってしまった誤りを赤裸々に公開しようと思う。
図を2種類表示するので、どちらがmatrixの初期値として正しい図か考えてみてほしい。
皆さんは、どちらの画像が正解かわかるだろうか。

図1

図2


答えは図1である。
(x、y)のxに関しては縦に動いていくと覚えておく。
中学数学の2次関数のイメージでxを左右の軸と誤認して進めると爆発
するので注意が必要。
私はその感覚で何となく図2を初手で作成し、見事に爆死した。

ちなみに、図1の表を左半回転すれば、中学数学で行った2次関数の表みたいになるなぁすごい(語彙力)と気づいた。これをトレース表を作るときに間違えずに実行できるならこの方法でもいいのかもしれない。
ただ、初手では問題文に表示された配列を何となくそのまま書き連ねていくと思うので、いきなり図3を思いつく方は稀なんじゃないかと思う。思いたい。

図3

ちなみに、プログラムを実行していった結果のトレース表は次のような感じになると想定。(解答例です。)
25行も書いて「i」「j」の向きが反対であると気づいたときは発狂した。

トレース表作成時の3原則

ここからは、トレース表が謎の芸術作品にならないよう、トレース表を作っていて気づいた注意点を3つお伝えしたいと思う。(書いてから3つ考えてるのは秘密。)

  1. 初期値を絶対に書く

  2. 処理結果のみを書き、計算過程は省略または余白にメモのみとする

  3. できるだけ小さい文字で書く

初期値に関しては必ず書いた方がいい。
初期値をメモしなくてもすぐに結果が分かる問題であれば、省略は可能である。
ただ、使用する変数や関数が多いプログラムに関しては初期値を書かないとケアレスミスが発生する。
トレース途中で頭がこんがらがってしまうのである。
注意点としては、プログラムの実行結果をあまり意識していないと誤った初期値を入力しても気づけず、トレース表を作成しきってから泣くことになるの要注意。

次に、トレース表には処理結果のみを書くという点である。
問題文には「X+Y」といった計算式の行が登場する。
私はワーキングメモリが3くらいなので(いみわかります?)計算式も全て数字を代入して具体的なトレース表を作っていたが、やはり途中で謎の暗号になっていった。
計算式を書くこと自体は悪くないが、トレース表には書き込まず、余白にメモをするなどをするとよいのかもしれない。

最後に、できるだけ小さい文字で書くである。
試験の時に配られるメモ用紙はA4サイズの用紙1枚で、大きい文字で書いているとトレース表の作成途中で用紙をはみ出しそうになってしまい、とってもイライラする。
なので、基本的なコツではあるが、できるだけ小さい文字で、書くことをお勧めする。
慣れてくると、「大体これくらいの要素が書ければ問題ない」と感覚がつかめてくるので、感覚がつかめてきたら、必要な要素数に見合ったトレース表を自然と作れるようになる。
見通しを立てることができないうちは小さい文字で書くとよい。

お し ま い(なげやり)




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