ITパスポート 令和6年度 問62:algorithmに関する問題
関数 convert は、整数型の配列を一定のルールで文字列に変換するプログラムである。関数 convert を convert(arrayInput) として呼び出したときの戻り値が "AABAB" になる引数 arrayInput の値はどれか。ここで、arrayInput の要素数は1以上とし、配列の要素番号は1から始まる。[プログラム] ○文字列型: convert(整数型の配列: arrayInput) 文字列型: stringOutput ← "" 整数型: i for (i を 1 から arrayInput の要素数 まで 1 ずつ増やす) if (arrayInput[i] が 1 と等しい) stringOutput の末尾 に "A" を追加する else stringOutput の末尾 に "B" を追加する endif endfor return stringOutput
- a{0, 0, 1, 2, 1}
- b{0, 1, 2, 1, 1}
- c{1, 0, 1, 2, 0}
- d{1, 1, 2, 1, 0}正答
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは d です。
このプログラムのルールはとてもシンプル。配列の数字を前から1個ずつ見て、「1だったらA、それ以外はぜんぶB」と置きかえて並べるだけです。
求める答えは "AABAB"。つまり前から「A・A・B・A・B」なので、置きかえ前の数字は「1・1・(1以外)・1・(1以外)」のはず。
dの {1,1,2,1,0} を当てはめると、1→A、1→A、2→B、1→A、0→B でちょうど "AABAB" になります。
👉 覚え方:1ならA、1じゃなければB。1の位置だけ見ればOK。
ほかの選択肢:a・b・cは1の出てくる場所がズレていて、Aの並びが "AABAB" になりません。
なぜこれが正解か
正解は d。関数の処理は「配列を先頭から走査し、要素が1ならAを、それ以外ならBを文字列の末尾に追加する」だけ。よって出力 "AABAB" になる入力は、各文字を逆変換して A=1、B=1以外 と読み替えればよい。
パターンは A,A,B,A,B → 1, 1, (≠1), 1, (≠1)。
d の {1,1,2,1,0} は 1→A、1→A、2→B、1→A、0→B で "AABAB" となり一致。
各選択肢の検証
- a {0,0,1,2,1} → B,B,A,B,A = "BBABA"
- b {0,1,2,1,1} → B,A,B,A,A = "BABAA"
- c {1,0,1,2,0} → A,B,A,B,B = "ABABB"
いずれも不一致。
解き方のコツ
選択肢を頭から計算するより、目標文字列を先に数字パターンへ翻訳(A=1/B=1以外)してから選択肢を照合すると速い。判定条件が「1かどうか」だけな点を見落とさないこと。
理論的背景
このアルゴリズム問題は、条件分岐による変換ルール「要素が1ならA、それ以外ならB」の適用を理解した上で、逆算(出力文字列から入力配列を導く)を求めている。戻り値が"AABAB"(5文字)であることから配列の要素数は5。文字位置ごとに変換規則を逆引きすると:A→1、A→1、B→1以外、A→1、B→1以外。選択肢dの{1,1,2,1,0}は、位置1=1→A、位置2=1→A、位置3=2(1でない)→B、位置4=1→A、位置5=0(1でない)→B となりAABABに合致する。アルゴリズムトレースにおいては条件「arrayInput[i] が 1 と等しい」という等値比較の精密な読み取りが鍵で、「1かどうか」だけが分岐基準であり「0か1か2か」という三分岐ではない点に注意。
実務での使われ方
このような整数→文字列変換ロジックは符号化・エンコード処理の基礎であり、実務では2進数・16進数表現の変換ルーティン、ステータスコードのラベル変換、有限状態機械(FSM)の遷移テーブル実装などで頻繁に登場する。特にIoTデバイスのファームウェアやプロトコルパーサでは、バイト列の各ビットをフラグとして解釈し人間可読な文字列へ変換する処理が不可欠。また単体テスト設計においても「境界値」として1と1以外(0や2)を組み合わせたテストケース設計は標準的アプローチとなっており、本問のような入出力逆算は同値クラス検証の基礎知識と直結している。
試験での位置づけ
ITパスポートのアルゴリズム問題は近年出題数が増加傾向にあり、「プログラムを読んで出力を求める」または「逆に出力から入力を求める」形式が両方出題されている。本問は後者(逆算型)。for文のループ変数管理・if-else分岐・文字列末尾への追加という3要素を同時に理解していることが前提となり、合格ライン(600点)到達者を振り落とす差別化問題として機能している。基本情報技術者(FE)では擬似コードが複数ネスト・再帰呼び出し・配列操作を組み合わせた複合問題に発展し、アルゴリズムの時間計算量(O記法)まで問われるようになる。Python/Java等の実際のコードに対応する読解力も求められる。
選択肢の発展補足
選択肢aの{0,0,1,2,1}はA,A,Bの位置でのみ正解だが先頭2文字がBBになるため不一致。選択肢bの{0,1,2,1,1}は位置2に1があるのでBABAA相当となり不一致。選択肢cの{1,0,1,2,0}はABABB相当となり不一致。この選択肢比較から学べる重要な概念は「0は1ではない」という点で、ゼロと偽(false)、ゼロと非1を混同しないこと。多くのプログラミング言語では0はfalse相当として扱われるが、本問のアルゴリズムは「1と等しいかどうか」の厳密な比較であり、プログラム言語における厳密等値(===)と緩い等値(==)の違いを意識する良い題材でもある。
出典:IPA(情報処理推進機構)公式 ITパスポート試験 令和6年度 問62/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。