戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

ITパスポート 2012年 秋期 72


問題文

図に示すように、文字列の各文字を置換表に従って置き換える処理を考える。このような置換えを行った結果が“0110001010”であったとき、置換え前の文字列はどれか。
ITパスポート 2012年 秋期  問72の問題画像

選択肢

ABBAAABB
ACAAABB(正解)
ACABB
CAAABB

🔒 解説は解答すると表示されます

文字の置換表(可変長ビット列)の復元【ITパスポート 解説】

正解の理由

理由の要点は次のとおりです。
置換表は A → 0、B → 10、C → 11 です(2進表示は binary:0 と 1 の並び)。得られたビット列 "0110001010" を左から順に読み、置換表に一致する最短のビット列を取り出していくと、順に A, C, A, A, A, B, B となり、元の文字列は ACAAABB になります。
この方法が使えるのは、どのコードも他のコードの先頭(プレフィックス)になっていないため(プレフィックスコード=prefix-free)です。プレフィックスでないとどこで切るか曖昧になり正しく復元できません。

解法ステップ

  1. 置換表を確認する:
    A → 0、B → 10、C → 11
  2. 与えられたビット列を左から順に読む("0110001010")。
  3. 次のルールで取り出す:
    • 先頭ビットが 0 のときは A(0 は A に対応)を確定して1ビット分を切る。
    • 先頭ビットが 1 のときは次の1ビットも見て、"10" なら B、"11" なら C を確定して2ビット分を切る。
  4. 上記を繰り返すと、読み取り結果は次の通り:
    • 0 → A(残り "110001010")
    • 11 → C(残り "0001010")
    • 0 → A(残り "001010")
    • 0 → A(残り "01010")
    • 0 → A(残り "1010")
    • 10 → B(残り "10")
    • 10 → B(残り "")
  5. したがって元の文字列は A C A A A B B、すなわち ACAAABB(選択肢イ)。
(補足)このような「可変長でビット列へ置換」する手法は、データ圧縮の分野でよく使われます。重要なのは「どの符号も他の符号の先頭になっていない」ことです。これにより左から順に一意に復号(デコード)できます。

選択肢別の誤答解説

各選択肢を置換表でエンコードしたビット列と、問題のビット列(0110001010)との比較です。
  • ア: ABBAAABB
    エンコード:0 10 10 0 0 0 10 10 → 010100001010(12ビット)
    与えられた 0110001010(10ビット)と異なるため誤り。
  • イ: ACAAABB ← 正解
    エンコード:0 11 0 0 0 10 10 → 0110001010(10ビット)
    与えられたビット列と一致するため正解。
  • ウ: ACABB
    エンコード:0 11 0 10 10 → 01101010(8ビット)
    長さも内容も一致しないため誤り。
  • エ: CAAABB
    エンコード:11 0 0 0 10 10 → 110001010(9ビット)
    長さが異なり一致しないため誤り。
上記のように、ビット列の長さと並びの両方で比較すれば簡単に不一致が分かります。

よくある誤解

  1. 「0 を '10' の一部と考えてもよい」と誤解する。
    • 置換表がプレフィックスになっていなければ混乱しますが、今回は A=0 が他のコードの先頭ではないため、0 は単独で A と確定できます。よって左から最短で決めてよいです。
  2. 右から読む・右端で区切ろうとするミス。
    • ここでは左から順に読むのが自然で確実です(与えられている置換表の符号が左から読んで決められるため)。右から読むと解釈が変わり誤答になります。
  3. 「全て同じ長さでグループ化すればよい」と考える。
    • 符号が可変長なので固定長で区切ると誤りになります。必ず置換表を参照して可変長で切り分けます。

補足コラム

  • プレフィックスコード(prefix-free code):ある符号が別の符号の先頭になっていないコード集合のこと。例:{0, 10, 11} はプレフィックスコード。プレフィックスであることで「左から最短一致」で一意にデコードできます。
  • ハフマン符号(Huffman coding):可変長でよく使われる圧縮方法の一つで、文字の出現頻度に応じてプレフィックスコードを作ります。今回の問題はハフマン符号そのものではありませんが、可変長符号の性質理解に役立ちます。
簡単なデコードの擬似コード(読み方のイメージ):
mapping = {'0':'A', '10':'B', '11':'C'}
s = "0110001010"
i = 0
result = []
while i < len(s):
    if s[i] == '0':
        result.append('A'); i += 1
    else:
        # s[i] == '1' のときは2ビット読む
        result.append('B' if s[i+1] == '0' else 'C')
        i += 2
print(''.join(result))  # ACAAABB

FAQ

Q. なぜ左から順に短い方(0なら即A)を取ってよいのですか?
A. 今回の符号集合はプレフィックスになっているためです。プレフィックスであれば、左から最初に一致する符号を取る操作で必ず正しく復元できます。
Q. もし置換表がプレフィックスでなければどうなる?
A. 例えば A→0, B→01 のように A の符号が B の先頭になると、"01" を見たとき A+? と B のどちらか曖昧になります。その場合は追加の情報や別の一意性条件が必要で、単純な左からの貪欲法(最短一致)は使えません。
Q. 符号を決めるときのルールは?
A. デコードを一意に行いたいときはプレフィックス性を満たすのが標準です。ハフマン符号などはこの性質を利用して可変長で効率よく符号化します。

関連キーワード: 可変長符号、プレフィックスコード、デコード、バイナリ表現、ハフマン符号、符号化・復号、ビット列解析
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について