<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>午後問題の解説 | 基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</title>
	<atom:link href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/tag/%E5%8D%88%E5%BE%8C%E5%95%8F%E9%A1%8C%E3%81%AE%E8%A7%A3%E8%AA%AC/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi</link>
	<description>基本情報技術者試験を学習する人のためにつくられた専門メディア。250本以上の記事を掲載し、勉強方法や各分野のポイント、過去問解説など、試験に役立つ情報を発信。試験対策書籍を執筆する著者が、はじめて学ぶ人でもわかりやすく解説します。（2023年度からの新制度に対応済み）</description>
	<lastBuildDate>Wed, 20 May 2026 00:42:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.29</generator>
	<item>
		<title>基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/</link>
		<pubDate>Mon, 25 Apr 2022 05:25:57 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[新試験情報]]></category>
		<category><![CDATA[試験情報]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=guide&#038;p=6461</guid>
		<description><![CDATA[<p>先程、 IPA は 2023 年 4 月以降の試験制度に関する大きな変更を発表しました。 プレス発表　基本情報技術者試験と情報セキュリティマネジメント試験を通年試験化：IPA 独立行政法人 情報処理推進機構 これによると [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/">基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>先程、 IPA は 2023 年 4 月以降の試験制度に関する大きな変更を発表しました。</p>
<blockquote><p><a href="https://www.ipa.go.jp/about/press/20220425.html" rel="noopener" target="_blank">プレス発表　基本情報技術者試験と情報セキュリティマネジメント試験を通年試験化：IPA 独立行政法人 情報処理推進機構</a></p></blockquote>
<p>これによると年 2 回試験だったものを通年に変更するほか、これまで難関とされてきた午後試験を簡略化し、選択分野やプログラミング言語選択を廃止、情報セキュリティとアルゴリズム中心に出題が変更されます。</p>
<h2>主な変更点</h2>
<p>主な変更点は以下のとおりです。</p>
<ul class="background c-round">
<li>上期 / 下期試験から<span class="bold">通年試験</span>へ（受験日時を選ぶ方式へ）</li>
<li>午前 / 午後試験から &#8220;科目 A 試験&#8221; / &#8220;科目 B 試験&#8221; へ変更
<ul>
<li>科目 A 試験の主題範囲は従来の午前試験と変更なし</li>
</ul>
</li>
<li>午後試験の試験範囲が大きく変更され、<span class="bold">情報セキュリティから 4 問とアルゴリズム（擬似言語）から 16 問が出題</span>へ
<ul>
<li><span class="bold">選択分野を廃止</span>（従来は、テクノロジ系 [ハードウェア、ソフトウェア、データベース、ネットワーク、ソフトウェア設計] とマネジメント系とストラテジ系から選択）</li>
<li>従来の Java や Python など<span class="bold">プログラミング言語の選択を廃止</span> <i class="material-icons">arrow_forward</i> 擬似言語に統一 </li>
</ul>
</li>
<li>試験時間、試験問題数を削減（上記の IPA プレス発表より抜粋）<br />
<table class="centered inline-block mag_h20">
<thead class="hide-on-small-only">
<tr>
<th colspan="2" width="50%" valign="middle" align="center">変更前</th>
<th colspan="2" width="50%" valign="middle" align="center">変更後</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更前</span>午前試験<br />（小問）</td>
<td>試験時間： 150 分<br />出題数： 80 問<br />解答数： 80 問</td>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更後</span>科目 A 試験<br />（小問）</td>
<td>試験時間： 90 分<br />出題数： 60 問<br />解答数： 60 問</td>
</tr>
<tr>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更前</span>午後試験<br />（大問）</td>
<td>試験時間： 150 分<br />出題数： 11 問<br />解答数： 5 問<br />※選択問題あり</td>
<td align="center"><span class="chip hide-on-med-and-up mag_rt05">変更後</span>科目 B 試験<br /><u><span class="bold">（小問）</span></u></td>
<td>試験時間： 100 分<br />出題数： 20 問<br />解答数： 20 問<br /><u><span class="bold">※選択問題なし（全問必須）</span></u></td>
</tr>
</tbody>
</table>
</li>
<li>合格基準を従来の 60 点以上という絶対評価から <span class="bold">IRT 方式へ変更</span>（項目ごとに点数を調整）</li>
<li>リテイクポリシー（再受験）は受験日の <span class="bold">30 日後</span>から再受験可能</li>
<li>午前試験免除制度は維持</li>
</ul>
<p>試験をコンパクトにして受験しやすいように、という意図で変更されました。 この変更に伴い、大きく難易度が変化します。</p>
<p>なお、この試験の変更は <span class="bold">2023 年 4 月 5 日</span> から開始され、<del>試験申込は 2023 年 3 月 15 日から予定されています</del> 申込がスタートしました。 詳しくは以下の記事をご覧ください。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p class="grey-text small-text"><i class="material-icons mag_rt05">info_outline</i>関連記事</p>
<p><a href="../new_system_launch/"></p>
<div class="row valign-wrapper pad_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/03/cover_new_system_launch-300x169.jpg" width="300" height="169" loading="lazy" ></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">2023 新制度・基本情報技術者試験 受験申込～受験～合格発表までの流れ</div>
</div>
<p></a></p>
<div class="divider mag_bt40 mag_tp10"></div>
<h2>新試験の申込方法も発表</h2>
<p>2023 年 2 月に新制度の申込方法も発表されました。</p>
<dl class="background c-round">
<span class="post-title indigo-text u">試験概要</span></p>
<dt class="chip">受験時間</dt>
<dd class="mag_bt10">
<p class="bold mag_h00">科目 A 試験と科目 B 試験を同日に受験</p>
<dl>
<dt></dt>
<dd>科目 A 試験　90 分</dd>
<dt></dt>
<dd>科目 B 試験　100 分</dd>
</dl>
</dd>
<dt class="chip">申込開始</dt>
<dd class="mag_bt10">2023 年 3 月 15 日 10 時から</dd>
<dt class="chip">試験開始</dt>
<dd class="mag_bt10">2023 年 4 月 5 日から</dd>
<dt class="chip">受験場所</dt>
<dd class="mag_bt10"><a href="https://www.jitec.ipa.go.jp/1_00topic/cbts_kaijyo_20230220.pdf" rel="noopener" target="_blank">全国 47 都道府県の CBT テストセンター</a><br />（ 2023 年 2 月 20 日時点）<br />申込時に日時と場所を選択</dd>
<dt class="chip">受験費用</dt>
<dd class="mag_bt10">7500 円（税込）</dd>
<dt class="chip">申込方法</dt>
<dd class="mag_bt10"><a href="https://itee.ipa.go.jp/ipa/user/public/entry/" rel="noopener" target="_blank">情報処理技術者試験・情報処理安全確保支援士試験 マイページ</a> より申込</dd>
<dt class="chip">合格発表</dt>
<dd class="mag_bt10">受験月の翌月中旬<br />（試験終了後、画面上で科目 A / 科目 B の科目評価点を表示）</dd>
<dt class="chip">リテイクポリシー（再受験）</dt>
<dd><span class="bold">受験翌日の 30 日後から再受験可能</span><br />（再受験申込は受験終了時刻から最長 1 日後から申込可能）</dd>
</dl>
<p>従来試験は年 2 回の受験に限定されていたものが、受験日が 30 日後から再受験可能になり、大きくハードルが下がりました。</p>
<h2>識者に聞く試験内容変更による難易度の変化</h2>
<p>情報処理技術者試験の様々な区分で参考書を執筆される三好康之さん、矢沢久雄さんに試験内容変更による難易度を解説いただきましたので、関連記事も合わせてぜひご覧ください。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../renew_fe_level/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_renew_fe_level-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">ベストセラー対策本の著者が分析！ 新・基本情報技術者試験の難易度</div>
</div>
<p></a><br />
<a href="../check_new_course_b/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_check_new_course_b-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">新しい基本情報技術者試験は「受験しやすく合格しやすくなる！」 サンプル問題から科目 B 問題の難易度を解説</div>
</div>
<p></a><br />
<a href="../changed4dx/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/04/cover_changed4dx-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報技術者試験はどう変わる？ 開発者向けから「デジタル人材」向け資格へ ～試験要綱とシラバス変更点（科目 B 試験など）を調査</div>
</div>
<p></a></p>
<h2>科目 A 試験 / 科目 B 試験のサンプル問題セットを解説</h2>
<p>2022 年 12 月 26 日に IPA は科目 A 試験（ 60 問） / 科目 B 試験（ 20 問）のサンプル問題セットを公開しました。</p>
<blockquote><p><a href="https://www.jitec.ipa.go.jp/1_00topic/topic_20221226.html" rel="noopener" target="_blank">IPA     独立行政法人 情報処理推進機構：基本情報技術者試験、情報セキュリティマネジメント試験の通年試験に関するお知らせ（サンプル問題セット、リテイクポリシーの公開）</a></p></blockquote>
<p>早速、サンプル問題セットの分析 / 旧制度との難易度比較 / 勉強方法を、矢沢 久雄さんに解説いただきました。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../analytics_sample_exam/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../..//wp-content/uploads/2023/01/cover_exam_a-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 A 試験対策は過去問演習｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (1)</div>
</div>
<p></a><br />
<a href="../analytics_sample_exam/exam_b_programming/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/01/cover_exam_b_programming-1-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 B 試験 アルゴリズムとプログラミング 対策はプログラミングを経験すること｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (2)</div>
</div>
<p></a><br />
<a href="../analytics_sample_exam/exam_b_sec/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../..//wp-content/uploads/2023/01/cover_exam_b_sec-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">科目 B 試験 情報セキュリティ 対策は旧午前試験の過去問で演習｜科目 A 試験・科目 B 試験サンプル問題セットからわかる傾向と対策 (3)</div>
</div>
<p></a></p>
<div class="divider mag_tp10 mag_bt40"></div>
<h2>科目 A 試験 / 科目 B 試験 対策に効く連載</h2>
<p>受験ナビでは新しい科目 A 試験 / 科目 B 試験の勉強に使える連載をスタートしています。 ぜひご覧ください。</p>
<h3>科目 A 試験対策の連載<br /> 「基本情報ではじめる IT の勉強」</h3>
<p>試験の受験層がリスキリングして IT をはじめて学ぶ方も増えたため、受験ナビでは科目 A 試験の各分野ごとにあらましや必要性、用語、過去問などを紹介する連載をスタートしています。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../../learn_tech/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2022/08/cover_computer_science4beginners-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">基本情報ではじめる IT の勉強</div>
</div>
<p></a></p>
<div class="divider mag_tp10 mag_bt40"></div>
<h3>科目 B 試験 アルゴリズムとプログラミング 対策の連載<br /> 「新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門」</h3>
<p>科目 B 試験では出題される 20 問のうち、 16 問出題されるのがアルゴリズムとプログラミングです。 はじめてアルゴリズムとプログラミングを学ぶ方向けの連載で、ぜひプログラミングデビューしましょう。</p>
<div class="divider mag_tp40 mag_bt10"></div>
<p><a href="../../similar_programming/"></p>
<div class="row valign-wrapper mag_w20">
<div class="col s3 m2 flex pad_00"><img src="../../wp-content/uploads/2023/01/about_programming_algorithm_cover-300x169.jpg" width="300" height="169" /></div>
<div class="col s9 m10 pad_10 blue-grey-text bold">新しい擬似言語で学ぶ 科目 B アルゴリズムとプログラミング入門</div>
</div>
<p></a></p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/guide/revision_system_on_202304/">基本情報技術者試験が2023年4月から通年試験になり午後試験が大きく変更。プログラミング言語の選択も廃止</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/</link>
		<pubDate>Wed, 06 Apr 2022 02:30:17 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[テクニック 具体的な値を想定]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6431</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 24 年度 春期 問 8 「ビットの検査」を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}.card-panel{margin:1.5em auto;}pre{position:relative;background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}dt{text-align:right;width:5em}dl.inline dd{margin-left:6em}.box-border{position:absolute;padding:2em;border:.2em solid #f06292;}@media screen and (max-width:600px){.width-half-on-large{width:100%}}</style>
<h2>問題に示された具体例を見てプログラムの機能を理解する</h2>
<p>平成 24 年度 春期「ビットの検査」の問題を見てみましょう。 以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 24 年度 春期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_qs.pdf#page=35" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2012h24_1/2012h24h_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>この問題の内容は、前半部（設問 1 、設問 2 ）と後半部（設問 3 ）の 2 部構成になっています。</p>
<p>前半部は、 8 ビットの引数 Data の中で、 8 ビットの引数 Mask で指定したビット位置にあるビットの値を検査した結果を返す BitTest 関数です。</p>
<p>後半部は、 8 ビットの引数 Data の中にある 1 の個数を返す BitCount 関数です。</p>
<p>前半部の BitTest 関数のプログラムは、以下に示したように、とてもシンプルであり、プログラムの機能を理解できれば、問題を解けるでしょう。 <span class="u">この前半部で、 50 % の正解を目指す</span>ことにします。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、問題に示された BitTest 関数の説明です。この説明を読んだだけでは、プログラムの機能がよくわかりませんね。</p>
<div class="card-panel">
〔プログラム 1 の説明〕</p>
<p>　整数型関数 BitTest を，次のとおりに宣言する。</p>
<pre>
〇整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask)
</pre>
<p>　検査される 8 ビットのデータは入力用の引数 Data に，検査をするビット位置の情報は入力用の引数 Mask に，それぞれ格納されている。 Mask 中のビットの値が 1 で あるビット位置に対応した Data 中のビットを検査して，次の返却値を返す。ここで， Mask 中には 1 のビットが 1 個以上あるものとする。</p>
<dl class="inline background c-round">
<dt>返却値 0:</dt>
<dd>検査した全てのビットが 0</dd>
<dt>1:</dt>
<dd> 検査したビット中に 0 と 1 が混在</dd>
<dt>2:</dt>
<dd>検査した全てのビットが 1</dd>
</dl>
</div>
<p>おそらく出題者も「説明だけではわからないだろう」と思ったのでしょう。 そこで、説明の後に、以下の具体例を示しています。</p>
<p>この具体例を見れば、プログラムの機能がわかるはずです。</p>
<div class="card-panel">
　例えば，図 1 の例 1 では， Mask のビット番号 7 ～ 5 の 3 ビットが 1 であるので， Data のビット番号 7 ～ 5 の 3 ビットの値を検査し， 0 と 1 が混在しているので返却値 1 を返す。 例 2 では， Mask のビット番号 4 と 0 の 2 ビットが 1 であるので， Data の ビット番号 4 と 0 の 2 ビットの値を検査し，どちらも 1 であるので返却値 2 を返す。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2022/04/h24h_q8_figure_1.jpg" loading="lazy"><figcaption>図 1 　BitTest の実行例</figcaption></figure>
</div>
<p>BitTest 関数は、引数 Mask の中にある 1 の位置で、引数 Data をチェックする桁を指定します。 BitTest 関数は、返却値として、チェックする桁が全て 0 なら 0 を返し、 0 と 1 が混在していれば 1 を返し、全て 1 なら 2 を返します。</p>
<p>このように、<span class="u">問題に具体例が示されているときは、それを見れば、短い時間にプログラムの機能を理解できる</span>ようになっています。 問題に具体例があったら<span class="bold">「ヒントだ！」</span>と思ってください。</p>
<h2>選択肢に示された変数に具体的なデータを想定して考える（設問 1 ）</h2>
<p>プログラムの機能を理解できたので、設問を解いてみましょう。 設問 1 は、 BitTest 関数のプログラムの穴埋めです。 以下に、再度プログラムを掲載します。</p>
<p>空欄 a が真なら返却値を 2 にしています。 したがって、空欄 a は、チェックする桁が全て 1 であることの条件です。<br />
空欄 b が真なら返却値を 0 にしています。 したがって、空欄 b は、チェックする桁が全て 0 であることの条件です。</p>
<div class="card-panel pad_bt00">
〔プログラム 1 〕</p>
<pre>
○整数型関数 : BitTest (8 ビット論理型: Data, 8 ビット論理型: Mask) 
○整数型: RC         /* 返却値 */
▲ <span class="blank">a</span>
| • RC ← 2         /* 返却値は 2 */
+―――
| ▲ <span class="blank">b</span>
| | • RC ← 0        /* 返却値は 0 */
| +―――
| | • RC ← 1        /* 返却値は 1 */
| ▼
▼
• return RC          /* RC を返却値として返す */
</pre>
</div>
<p>以下は、空欄 a と空欄 b の選択肢です。</p>
<p>&#8220;&#038;&#8221; は AND 演算（論理積）を意味し、 &#8220;|&#8221; は OR 演算（論理和）を意味しています。 これらは、条件を結ぶ論理演算ではなく、 2 つの 2 進数の対応する桁同士で論理演算をするものです。</p>
<p>それでは、これらの論理演算を使って、チェックする桁が全て 1 であることと、チェックする桁が全て 0 であることは、どうすれば判断できるのでしょうか？</p>
<div class="card-panel pad_bt00">
解答群</p>
<pre>
ア　(Data & Mask) = "00000000" B
イ　(Data & Mask) = Data
ウ　(Data & Mask) = Mask
エ　(Data | Mask) = "00000000" B
オ　(Data | Mask) = Mask
</pre>
</div>
<p>こういうことを頭の中だけで考えていると、どんどん時間が経過してしまいます。 選択肢があるのですから、それらをよく見てください。</p>
<p>どの選択肢でも、行っている論理演算は、 <code class="language-none pad_w05">Data & Mask</code>（ AND 演算）と <code class="language-none pad_w05">Data | Mask</code> （ OR 演算）のいずれかなのですから、 <span class="u">Data と Mask に具体的なデータを想定</span>して考えましょう。 そうすれば、短い時間に正解を選ぶことができます。</p>
<p>&nbsp;</p>
<p>返却値が 2 （チェックする桁が全て 1 である）になる具体例として、問題に示されていた</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00010001</pre>
<p>を想定してみましょう。</p>
<pre class="mag_h40">
      00110011 Data
AND   00010001 Mask
――――――――――――――――――
      00010001
</pre>
<pre>
      00110011 Data
OR    00010001 Mask
――――――――――――――――――
      00110011
</pre>
<p>以上のように、 AND 演算の結果は 00010001 になり（これは、 Mask と同じであり選択肢ウです）、 OR 演算の結果は 00110011 になります（これは、 Data と同じであり選択肢にありません）。</p>
<p>したがって、選択肢ウが正解です。</p>
<p>返却値が 0 （チェックする桁が全て 0 である）になる具体例は、問題に示されていないので、先ほどの具体例をアレンジして</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 10001000</pre>
<p>を想定してみましょう。</p>
<pre class="mag_tp40">
      00110011 Data
AND   10001000 Mask
――――――――――――――――――
      00000000
</pre>
<pre class="mag_bt40">
      00110011 Data
OR    10001000 Mask
――――――――――――――――――
      10111011
</pre>
<p>以上のように、 AND 演算の結果は 00000000 になり（これは、選択肢アです）、 OR 演算の結果は 10111011 になります（これは、選択肢にありません）。</p>
<p>したがって、選択肢アが正解です。</p>
<h2>具体例を想定してプログラムをトレースする（設問 2 ）</h2>
<p>設問 2 は、 BitTest 関数で引数 Mask を 00000000 （チェックする桁の指定なし）としたときに、返却値として 0 を返すようにするには、プログラムをどのように修正すればよいかという内容です。 変更なしも含めて、以下の 3 つの修正案が示されています。</p>
<p>問題に</p>
<blockquote>
<p class="grey-text">空欄 a と空欄 b には、設問 1 の正しい答えが入っているものとする</p>
</blockquote>
<p>とあるので、ここでは、それぞれの空欄にプログラムを入れてあります。</p>
<div class="card-panel">
<div class="row">
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = Mask
| • RC ← 2
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre class="mag_w05">
▲ (Data & Mask) = "00000000" B
| • RC ← 0
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
• return RC
</pre>
</div>
<div class="col m6 s12">
〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_w05">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2
▼
▲ (Data & Mask) = Mask
| • RC ← 1
▼
▼
• return RC
</pre>
</div>
</div>
<p>解答群<br />
ア　修正案 <i class="material-icons">looks_one</i>　　<br class="hide-on-med-and-up">イ　修正案 <i class="material-icons">looks_two</i><br />
ウ　修正案 <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">エ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_two</i><br />
オ　修正案 <i class="material-icons">looks_one</i> 及び <i class="material-icons">looks_3</i>　　<br class="hide-on-med-and-up">カ　修正案 <i class="material-icons">looks_two</i>及び <i class="material-icons">looks_3</i>
</div>
<p>この設問は、<span class="u">具体例を想定してプログラムをトレースすることで、解くことができます</span>。</p>
<pre>Data = 00110011</pre>
<p>および</p>
<pre>Mask = 00000000</pre>
<p>を想定してみましょう。</p>
<p class="mag_tp50">〔修正案 <i class="material-icons">looks_one</i> (変更なし) 〕</p>
<pre>
▲ (Data & Mask) = Mask
| • RC ← 2</span>
+―――
| ▲ (Data & Mask) = "00000000" B
| | • RC ← 0
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:12em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:15em;">(Data & Mask) = Mask となり、<br>変数 RC に 2 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 2 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_two</i> 〕</p>
<pre>
▲ (Data & Mask) = "00000000" B
| • RC ← 0</span>
+―――
| ▲ (Data & Mask) = Mask
| | • RC ← 2
| +―――
| | • RC ← 1
| ▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:.5em;left:2.25em;width:16em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:1em;left:20em;">(Data & Mask) = 00000000 となり、<br>変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:10em;">返却値として 0 が返される</span>
</pre>
<p>〔修正案 <i class="material-icons">looks_3</i> 〕</p>
<pre class="mag_bt50">
• RC ← 2
▲ (Data & Mask) = "00000000" B
| • RC ← 2</span>
▼
▲ (Data & Mask) = Mask
| • RC ← 1</span>
▼
▼
<span style="border:.2em solid #f06292;padding:.5em;">• return RC</span><span class="box-border" style="top:2.75em;left:1em;width:18em;padding:2.45em;"></span><span class="box-border" style="top:8.25em;left:1em;width:18em;padding:2.45em;"></span><span class="pink-text text-lighten-3" style="position:absolute;top:3em;left:20em;">(Data & Mask) = 00000000 となり、<br>いったん変数 RC に 0 が格納される。</span><span class="pink-text text-lighten-3" style="position:absolute;top:9em;left:20em;">(Data & Mask) = Mask ともなるので、<br>変数 RC が 2 で上書きされる。</span><span class="pink-text text-lighten-3" style="position:absolute;bottom:1em;left:11em;">返却値として 2 が返される</span>
</pre>
<p>以上のように、修正案 <i class="material-icons">looks_one</i> では、</p>
<pre>Data & Mask = Mask</pre>
<p>となるので、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_two</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので、返却値として 0 が返されます。</p>
<p>&nbsp;</p>
<p>修正案 <i class="material-icons">looks_3</i> では、</p>
<pre>Data & Mask = 00000000</pre>
<p>となるので返却値を格納する変数 RC にいったん 0 が格納されますが、</p>
<pre>Data & Mask = Mask</pre>
<p>も成り立つので変数 RC が 2 で上書きされて、返却値として 2 が返されます。</p>
<p>&nbsp;</p>
<p>したがって、修正案 <i class="material-icons">looks_two</i> だけが正しく動作し、選択肢イが正解です。</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、</p>
<ul class="background c-round bold">
<li>「問題に示された具体例を見てプログラムの機能を理解する」</li>
<li>「選択肢に示された変数に具体的なデータを想定して考える」</li>
<li>「具体例を想定してプログラムをトレースする」</li>
</ul>
<p>という解き方を紹介しました。</p>
<p>どの解き方にも「具体例」や「具体的」という言葉があります。 これは、<span class="u">他人（出題者）が作ったプログラムを短い時間で読み取るには、とにかく具体例を想定することが重要</span>だからです。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/check_bit/">アルゴリズム問題 具体化すれば 50 ％ 以上正解できる「ビットの検査」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/</link>
		<pubDate>Thu, 03 Mar 2022 02:55:55 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6414</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。 しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/">アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。 しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、平成 31 年度 春期 問 8 「ハフマン符号を用いた文字列圧縮」を取り上げます。</p>
<style>article{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}ol.background>li{ margin-left: 1.5em;}dl.inline dd{margin-left:2em;}.width-half-on-large{width:50%; margin:auto;}table{font-size:.85em;}@media screen and (max-width:600px){.width-half-on-large{width:100%}}</style>
<h2>試験の出題テーマをしっかりと学習しておく</h2>
<p>「ハフマン符号を用いた文字列圧縮」というタイトルを見てどう思いましたか。 もしも、「えっ？ ハフマン符号なんて知らないよ！」と思われたなら、それではいけません。</p>
<p>基本情報技術者試験には、試験の出題テーマの細目を示したシラバスという資料があります。 この中に「ハフマン符号」という言葉が、ちゃんと示されています。 そのため午前試験の問題でも、ハフマン符号が取り上げられたことがあります。</p>
<p>以下に例を示します。 この問題の正解は、選択肢エです。</p>
<p class="center grey-text mag_tp30">図　ハフマン符号は午前試験に出たこともある</p>
<div class="card-panel mag_bt30">
問 4　平成 30 年度 秋期 午前</p>
<p>出現頻度の異なる A ， B ， C ， D ， E の 5 文字で構成される通信データを，ハフマ<br />
ン符号化を使って圧縮するために，符号表を作成した。 a に入る符号として，適切なものはどれか。</p>
<table class="width-half-on-large centered striped mag_h10">
<thead>
<tr>
<th>文字</th>
<th>出現頻度(%)</th>
<th>符号</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td>26</td>
<td>00</td>
</tr>
<tr>
<td>B</td>
<td>25</td>
<td>01</td>
</tr>
<tr>
<td>C</td>
<td>24</td>
<td>10</td>
</tr>
<tr>
<td>D</td>
<td>13</td>
<td><span class="blank">a</span></td>
</tr>
<tr>
<td>E</td>
<td>12</td>
<td>111</td>
</tr>
</tbody>
</table>
<p>ア　001　　イ　010　　<br class="hide-on-med-and-up">ウ　101　　エ　110
</div>
<p><span class="u">試験の出題者は、シラバスに示されていることは、受験者が知っていることとして、詳しい説明なしで出題します</span>。 ですから、試験の出題テーマは、しっかりと学習しておくべきです。</p>
<p>シラバスに示されているのは、出題テーマの細目と用語例だけなので、シラバスを見て学習するわけにはいきません。 基本情報技術者試験の対策本（市販書籍）で学習することをお勧めします。 試験の主な出題テーマ（よく出る出題テーマ）が、網羅されているからです。</p>
<h2>アルゴリズムは手作業でやってみて体得するもの</h2>
<p><span class="bold">アルゴリズムは、暗記して覚えるものではありません。 </span>実際に手作業でやってみて、体得するものです。</p>
<p>先ほどの午前問題を例にして、ハフマン符号の作り方の手順（アルゴリズム）を説明しますので、紙の上に絵を描いて、実際にやってみてください。</p>
<p><span class="u">ハフマン符号は、文字列を圧縮するための技法</span>です。</p>
<p>通常の符号化では、どの文字にも同じビット数（固定長のビット数）を割り当てますが、<span class="u">ハフマン符号では、出現頻度が少ない文字ほど長いビット数（逆に言うと、出現頻度が多い文字ほど短いビット数）に符号化</span>します。</p>
<p>この符号化では、ハフマン木を使います。 ハフマン木は、出現頻度が少ない文字ほど、そこにたどり着くまでの枝の数が多くなるようにした二分木（ 2 つに枝分かれした木）です。</p>
<p>&nbsp;</p>
<p>先ほどの午前問題では、文字の出現頻度が、</p>
<p>A = 26 %<br />
B = 25 %<br />
C = 24 %<br />
D = 13 %<br />
E = 12 %</p>
<p>です。</p>
<ol class="background c-round">
<li>これらの文字を出現頻度の多い順に書き並べて、末端の葉（ leaf ）とします</li>
<li>出現頻度の少ない順に 2 つずつ結んで節（ node ）を作ります。 この節には、 2 つの文字の出現頻度の合計値を書き込みます</li>
<li>同じ手順を、すべての文字と節を結んで根（ root ）ができるまで繰り返せば、ハフマン木が出来上がります</li>
</ol>
<p>以下に上記の手順を図示します。</p>
<ol class="background c-round">
<li>文字を出現頻度の多い順に書き並べる<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_1.jpg" loading="lazy"><br />
</figure>
</li>
<li>出現頻度の少ない順に 2 つずつ結んで節を作り、 2 つの文字の出現頻度の合計値を書き込む<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_2.jpg" loading="lazy"><br />
</figure>
</li>
<li>同じ手順を、すべての文字と節を結んで根ができるまで繰り返せば、ハフマン木が出来上がる<br />
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_tree_3.jpg" loading="lazy"><br />
</figure>
</li>
</ol>
<p>ハフマン木が作成できたら、根からスタートして、左に 0 を、右 1 を割り当て、根から目的の文字までの 0 と 1 を書き並べたものが、ハフマン符号になります。</p>
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_code_1.jpg" loading="lazy"><figcaption>根から左に 0 右に 1 を割り当てる</figcaption></figure>
<p>以下のように、 A 、 B 、 C 、 D 、 E という文字のハフマン符号は、それぞれ 00 、 01 、 10 、 110 、 111 です。 ここでは、 D にたどる例を示しています。</p>
<figure>
<img class="pad_05 materialboxed z-depth-5 width-half-on-large" src="../../wp-content/uploads/2022/03/huffman_code_2.jpg" loading="lazy"><figcaption>ハフマン木をたどってハフマン符号を得る</figcaption></figure>
<h2>仕組みが分かっていればできる問題に確実に正解する</h2>
<p>前置きが長くなりましたが、平成 31 年度 春期 午後 問 8 「ハフマン符号を用いた文字列圧縮」を見てみましょう。</p>
<p>以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。 じっくり見ると時間がかかりますので、ざっとで OK です。</p>
<table class="responsive-width mag_h30">
<tr>
<th width="50%">平成 31 年度 春期 午後</th>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_qs.pdf#page=39">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_ans.pdf" rel="noopener" target="_blank">解答</a></td>
</tr>
</table>
<p>この問題で注目してほしいのは、プログラムの穴埋め（空欄 c 、 d 、 e 、 f ）もありますが、<span class="u">冒頭の空欄 a と b は、ハフマン符号の仕組みが分かっていればできること</span>です。 それなら、冒頭の空欄 a と b に確実に解くことに集中しましょう。</p>
<p>空欄は、全部で 6 つあるので、空欄 a と b に正解して、残りの空欄 c 、 d 、 e 、 f の 1 つ以上に運よく正解できれば、全体の 50 % に達します。</p>
<p>&nbsp;</p>
<p>以下は、問題に示されたハフマン木の例です。</p>
<figure>
  <img class="materialboxed z-depth-5 responsive-width pad_10" src="../../wp-content/uploads/2021/10/h31a_algo_figure.jpg" loading="lazy"><figcaption><span class="small-text">注記 丸の中の数値は各節がもつ値を表す。  &#8220;A&#8221; ～ &#8220;D&#8221; は葉に対応する文字を表す。 </span><br />
  図 1 　文字列 α に対応するハフマン木の例</figcaption></figure>
<p>先ほどの午前問題で示したハフマン木と比べて若干の違いがあり、出現頻度が多い文字を右側にしています（根からスタートして、左に 0 を、右 1 を割り当てるのは同じです）。 これは、問題に示されたプログラムの内容に合わせたからでしょう。</p>
<p>ただし、ハフマン符号の作り方の手順を体得していれば、この例に合わせてハフマン木を作れるはずです。</p>
<p>&nbsp;</p>
<p>以下は、空欄 a 、 b がある設問 1 です。</p>
<div class="card-panel mag_h30">
<p class="bold">設問 1</p>
<p>次の記述中の<span class="blank"></span>に入れる正しい答えを，解答群の中から選べ。</p>
<div class="background">
　文字列 &#8220;ABBBBBBBCCCDD&#8221; を，ハフマン符号化を用いて表現する。 各文字とビット表現を示した表は<span class="blank">a</span>である。 ハフマン符号化によって圧縮すると，文字 &#8220;A&#8221; ～ &#8220;D&#8221; をそれぞれ 2 ビットの固定長で表現したときの当該文字列の総ビット長に対する圧縮率は<span class="blank">b</span>となる。 ここで，圧縮率は次式で計算した値の小数第 3 位を四捨五入して求める。</p>
<div class="row valign-wrapper">
<p>圧縮率 =</p>
<div class="small-text mag_lt10">
<p class="center">ハフマン符号化によって圧縮したときの総ビット長</p>
<div class="divider"></div>
<p class="center">2 ビットの固定長で表現したときの総ビット長</p>
</div>
</div>
</div>
<p>a に関する解答群</p>
<div class="row">
<div class="col m6 s12 mag_h20">
ア</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>010</td>
<td>1</td>
<td>00</td>
<td>011</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
イ</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>010</td>
<td>0</td>
<td>01</td>
<td>111</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
ウ</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>100</td>
<td>0</td>
<td>101</td>
<td>11</td>
</tr>
</table>
</div>
<div class="col m6 s12 mag_h20">
工</p>
<table class="centered responsive-width">
<tr>
<th>文字</th>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
<tr>
<th>ビット表現</th>
<td>100</td>
<td>1</td>
<td>00</td>
<td>01</td>
</tr>
</table>
</div>
</div>
<p class="mag_tp30">b に関する解答群</p>
<p>ア　0.77　　イ　0.85　　<br class="hide-on-med-and-up">ウ　0.88　　エ　0.92
</div>
<p>文字の出現頻度は、</p>
<p>A = 1<br />
B = 7<br />
C = 3<br />
D = 2</p>
<p>です。</p>
<p>これらを、この問題の例に合わせたハフマン木にすれば、空欄 a 、 b を解くことができます。 さあ、紙の上に絵を描いて、やってみましょう。</p>
<p>&nbsp;</p>
<p>以下に、出来上がったハフマン木を示します。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width pad_10" src="../../wp-content/uploads/2022/03/q8_huffman_code.jpg" loading="lazy"><figcaption>図　設問 1 の例 &#8220;ABBBBBBBCCCDD&#8221; に合わせて作成したハフマン木</figcaption></figure>
<div class="chip">空欄 a</div>
<p>A 、B 、 C 、 D という文字のハフマン符号は、それぞれ 010 、 1 、 00 、 011 です。</p>
<p>したがって、空欄 a の正解は、選択肢アです。</p>
<div class="chip">空欄 b</div>
<p>A 、 B 、 C 、 D という文字を 2 ビットの固定長で表現すると、全体で 13 文字あるので、</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">2 × 13 = 26 ビット</p>
<p>です。</p>
<p>ハフマン符号で表現した場合は、</p>
<p>010 という 3 ビットの A が 1 文字<br />
1 という 1 ビットの B が 7 文字<br />
00 という 2 ビットの C が 3 文字<br />
011 という 3 ビットの D が 2 文字</p>
<p>なので、全体で</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">3 × 1 + 1 × 7 + 2 × 3 + 3 × 2 = 22 ビット</p>
<p>です。</p>
<p>圧縮率は、</p>
<p class="grey lighten-5 indigo-text pad_h05 pad_lt10">22 ÷ 26 ≒ 0.85</p>
<p>です。 したがって、空欄 b の正解は、選択肢イです。 できましたね！</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>今回は、<span class="u">「試験の出題テーマをしっかりと学習しておく」</span>ということの重要性と、<span class="u">「仕組みが分かっていればできる問題に確実に正解する」</span>という解き方を紹介しました。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。 少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/huffman_code/">アルゴリズム問題 出題テーマの仕組みがわかれば 50 ％ 以上正解できる「ハフマン符号を用いた文字列圧縮」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/</link>
		<pubDate>Tue, 15 Feb 2022 08:32:26 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=algorithms_tips&#038;p=6404</guid>
		<description><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めないでしょう。 この連載では、これまでに実施された基 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/">アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>基本情報技術者試験の受験者の多くは、午後試験のアルゴリズム問題を苦手としています。しかし、その<span class="u">苦手なアルゴリズム問題で、 50 % 以上の正解が得られないと、合格は望めない</span>でしょう。</p>
<p>この連載では、これまでに実施された基本情報技術者試験の過去問題を例にして、<span class="bold">最低でも 50 % 正解できる解き方</span>を紹介します。</p>
<p>今回は、現時点で入手できる最新の過去問題である令和元年度秋期<span class="u">「 Bitap 法による文字列探索」</span>を取り上げます。</p>
<style>article,pre{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}pre{background:#263238;color:#eceff1;font-size:1em;line-height:1.8;margin:1em -24px;padding:1em 0 1em 24px;}table{font-size:.85em;}dl.inline dd{margin-left:2em;}</style>
<h2>午後試験の配点と合格への戦略</h2>
<p>以下は、基本情報技術者試験の午後試験の構成と配点を示したものです。</p>
<figure class="responsive-width">
<table class="striped">
<caption>基本情報技術者試験の午後試験の構成と配点</caption>
<thead>
<tr>
<th>問題番号</th>
<th>分野</th>
<th>配点</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>情報セキュリティ</td>
<td>20 点</td>
</tr>
<tr>
<td>2 ～ 5</td>
<td>ソフトウェア・ハードウェア、データベース、ネットワーク、ソフトウェア設計から 3 問出題<br />マネジメント系、ストラテジ系から 1 問出題</td>
<td>各 15 点</td>
</tr>
<tr>
<td>6</td>
<td>データ構造およびアルゴリズム</td>
<td>25 点</td>
</tr>
<tr>
<td>7 ～ 11</td>
<td>ソフトウェア開発（ C 言語、Java 、 Python 、アセンブラ言語、表計算ソフトが各 1 問出題）</td>
<td>25 点</td>
</tr>
</tbody>
</table><figcaption>
<ul class="background c-round blue-grey-text left-align">
<li>問 1 と問 6 は、必須問題です。</li>
<li>問 2 ～問 5 は、 4 問中 2 問を選択します。</li>
<li>問 7 ～問 11 は、 5 問中 1 問を選択します。</li>
</ul>
</figcaption></figure>
<p>100 点満点で 60 点以上（ 60 % 以上の正解）が合格なのですが、苦手なアルゴリズム問題で 60 % 正解するのは至難の業でしょう。<span class="u">前半部の問 1 ～問 5 でガンバって 70 % 正解</span>しましょう。そうすれば、アルゴリズム問題に 50 % 正解で全体で 60 % に達します（<span class="u">ソフトウェア開発でも 50 % 正解</span>してくださいね！）。これが、合格への戦略です。</p>
<p>この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を紹介します。</p>
<h2>「こんな問題わかるか！」と言いたくなるような問題</h2>
<p>令和元年度秋期のアルゴリズム問題（ 問 8 ）を見てみましょう。以下に、問題と解答へのリンクがありますので、問題にざっと目を通してください。じっくり見ると嫌になっちゃうと思いますので、本当にざっとでいいですよ。</p>
<table class="responsive-width centered mag_h30">
<caption>令和元年度秋期 基本情報技術者試験 午後試験</caption>
<tr>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_qs.pdf#page=38" rel="noopener" target="_blank">問題</a></td>
<td><a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_2/2019r01a_fe_pm_ans.pdf">解答</a></td>
</tr>
</table>
<p>問題を見たご感想は、いかがですか？ 「こんな問題わかるか！」と言いたくなるような問題だったでしょう。テーマは、 Bitap 法です。</p>
<p>シラバス（試験の出題テーマの細目を示した資料）にも Bitap 法という用語はありません。強いて言えば、シラバスの「文字列処理のアルゴリズム」という分野に「文字列照合」という用語が示されているので、それで出題されたのでしょう。</p>
<p>ただし、過去の試験に、 Bitap 法が出題されたことはありません。おそらく、これまでに、どんな教材でも、どんな講座でも、 Bitap 法を取り上げているものはないでしょう。 Bitap （ bit-parallel approximate pattern matching 、ビット並列近似パターンマッチング）法は、状態遷移という考え方を使って文字列探索を行うアルゴリズムです。</p>
<p>「こんな問題わかるか！」ですね。</p>
<p>&nbsp;</p>
<p><span class="u">試験には、ときどき「こんな問題わかるか！」と言いたくなるような問題が出ることがあります</span>。そんなときは、<span class="bold">頭ごなしに「できない」と決めつけずに、冷静になってください</span>。</p>
<p>アルゴリズム問題は、選択問題ではなく必須問題（受験者の全員が解かなければならない問題）です。もしも、誰もできないような問題を出したら、その年度だけ合格率が極めて低くなってしまいます。それでは、出題者も困るでしょう。そうならないように、この手の問題は<span class="u">「何だかわからなくても説明された通りにやればできる」</span>ようになっています。</p>
<h2>何だかわからなくても説明された通りにやればできる（1）</h2>
<p>まず、設問 1 の空欄 b がわかりやすいと思いますので、そこから解いていきましょう。以下に、プログラムの説明（該当箇所を抜粋）、プログラム、および空欄 b の解答群を示します。</p>
<div class="card-panel">
〔プログラムの説明〕<br />
 　関数 GenerateBitMask は， Mask[] の全ての要素を &#8220;0&#8221;B に初期化した後，
</div>
<div class="card-panel">
<p class="grey-text hide-on-med-and-up mag_h10 small-text"><i class="material-icons light-blue-text mag_rt05">swipe</i>プログラムは横スクロールできます</p>
<p>〔プログラム〕</p>
<pre>
○整数型関数 : GenerateBitMask(文字型: Pat[], 16 ビット論理型: Mask[])
○整数型 : i, PatLen

・ PatLen ← Pat[] の文字数
■ i: 1, i ≦ 26, 1
|　・Mask[i] ← <span class="bold blank">b</span>  /* 初期化 */
■
■ i: 1, i ≦ PatLen, 1
|　・Mask[Index(Pat[i])] ← <span class="bold blank">c</span> と
|                   Mask[Index(Pat[i])] とのビットごとの論理和
■
· return (PatLen)
</pre>
</div>
<div class="card-panel">
〔解答群〕</p>
<p>b に関する解答群</p>
<dl class="inline">
<dt>ア</dt>
<dd>&#8220;0&#8221; B</dd>
<dt>イ</dt>
<dd>&#8220;1&#8221; B</dd>
<dt>ウ</dt>
<dd>&#8220;1&#8221; B を Pathen ビットだけ論理左シフトした値</dd>
<dt>エ</dt>
<dd>&#8220;1&#8221; B を (Pathen &#8211; 1) ビットだけ論理左シフトした値</dd>
<dt>オ</dt>
<dd>&#8220;1111111111111111&#8221; B</dd>
</dl>
</div>
<p>プログラムの説明とプログラム（ご丁寧にも /* 初期化 */ というコメントまであります）を対応付けると、空欄 b で行われている処理が</p>
<blockquote>
<p class="grey-text">Mask[] の全ての要素を &#8220;0&#8221;B に初期化</p>
</blockquote>
<p>だとわかるでしょう。空欄 b の解答群を見ると、選択肢アの &#8220;0&#8221;B が適切です。何だかわからなくても説明された通りに（プログラムの説明の通りに）やって、正解を選べました。同様の解き方で、空欄 c と空欄 a も正解を選べるでしょう。</p>
<h2>何だかわからなくても説明された通りにやればできる（2）</h2>
<p>今度は、設問 2 です。これは、以下のプログラムで、 Mask[Index(Text[i])] と Status の値をトレース（処理の流れと変数の変化を追いかけること）せよ、という問題です。</p>
<p>これこそ正に、何だかわからなくても説明された通りに（プログラムの内容の通りに）やればできる、の好例です。プログラムの意味も、何をやっているかも、わからなくて構いません。</p>
<p>Mask[Index(Text[i])] の初期値を &#8220;10101&#8221;B とし、<br />
Status の初期値を &#8220;1&#8221;B として<br />
トレースすればよいのです。</p>
<div class="card-panel">
〔プログラム〕</p>
<pre>
○整数型関数: BitapMatch(文字型: Text[], 文字型: Pat[])
○16 ビット論理型: Goal, Status, Mask[26]
○整数型: i, TextLen, PatLen
・TextLen ← Text[] の文字数
・PatLen ← GenerateBitMask(Pat[], Mask[])
・Status ← "0"B
・Goal ← "1"B を (PatLen - 1) ビットだけ論理左シフトした値
■ i: 1, i ≦ TextLen, 1
|　・Status ← Status を 1 ビットだけ論理左シフト値と              <i class="material-icons light-blue-text">fast_rewind</i>α
|                                         "1"B とのビットごとの論理和
|　・Status ← Status と Mask[Index(Text[i])] とのビットごとの論理積　<i class="material-icons light-blue-text">fast_rewind</i>β
|　▲ Status と Goal とのビットごとの論理積 ≠ "0"B
|　|　・return (i - PatLen + 1)
|　▼
■
· return (-1)
</pre>
</div>
<p>以下は、プログラムをトレースした結果です。これによって、空欄 d 、空欄 e 、空欄 f の正解を選べます。</p>
<table class="centered striped responsive-width">
<caption>プログラムをトレースした結果</caption>
<thead>
<tr>
<th>i</th>
<th>Mask[Index(Text[i])]</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>2</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B （空欄 d ）</td>
</tr>
<tr>
<td>3</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>4</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>5</td>
<td>&#8220;101000&#8221;B</td>
<td>&#8220;0&#8221;B</td>
</tr>
<tr>
<td>6</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>7</td>
<td>&#8220;10101&#8221;B</td>
<td>&#8220;1&#8221;B</td>
</tr>
<tr>
<td>8</td>
<td>&#8220;10&#8221;B</td>
<td>&#8220;10&#8221;B</td>
</tr>
<tr>
<td>9</td>
<td>&#8220;10101&#8221;B （空欄 e ）</td>
<td>&#8220;101&#8221;B （空欄 f ）</td>
</tr>
<tbody>
</table>
<p>さあ、これで十分でしょう。</p>
<p>この問題には、設問 1 （ a 、 b 、 c ）、設問 2 （ d 、 e 、 f ）、設問 3 （ g 、 h 、 i ）という、全部で 9 つの選択項目がありますが、ここまでで 6 つに正解できました。それぞれの配点はわかりませんが（設問ごとの配点は公開されていません）、 9 つの内の 6 つに正解できたのですから、きっと 50 % に達したでしょう。</p>
<p>設問 3 は、正規表現という、これまた小難しそうなテーマをからめているので、できなくても気にしないでください。</p>
<h2>試験問題の解説は、あくまでも参考としましょう</h2>
<p>市販教材や Web 記事などで、アルゴリズム問題の解説を読むときに注意してほしいことがあります。それは、こういうことを言うと甚だ無責任であり申し訳ないのですが、<span class="bold">「アルゴリズム問題の解き方は自分で見出してほしい」</span>ということです。</p>
<p>市販教材 や Web 記事などのアルゴリズム問題の解説では「こうだから、これが適切である」のように正解をズバリと示しています。それを読んだ人は「どうして、こうだから、を見いだせる理由がわからない」と思うでしょう。</p>
<p>「こうだから」がわかるのは、解説者の経験です。経験が違う読者には、理解できない部分があっても当然です。このようなアルゴリズム問題の解説は、あくまで参考として、自分流の「こうだから」を見出してください。もちろん、この連載も同様です。</p>
<div class="divider mag_tp60 mag_bt30"></div>
<p>今回は、<span class="u">「こんな問題わかるか！」と言いたくなるような問題でも、「説明された通りにやればできる」</span>という方法を紹介しました。</p>
<p>今後も、この連載では、アルゴリズム問題で最低でも 50 % 正解できる解き方を、あれこれと紹介していきます。少しでも、皆様の参考になれば幸いです。</p>
<p>それでは、またお会いしましょう！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/algorithms_tips/bitap/">アルゴリズム問題 こんなもん出来るかと思う問題でも 50 ％ 以上正解する「 Bitap 法による文字列探索」</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/</link>
		<pubDate>Sun, 16 Jan 2022 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[矢沢 久雄]]></dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[午後プログラミング言語問題]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=learn_python&#038;p=6354</guid>
		<description><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。 前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<p>この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。</p>
<p>前回までで、試験の出題範囲をほぼ網羅して学習できました。最終回となる今回は、総仕上げとして、試験問題レベルの Python のプログラムにチャレンジしてみましょう。</p>
<div class="background red-text small-text pink-text">
<i class="material-icons">report</i>現時点で、 Python の過去問題は公開されていません。この記事に示した問題は、<a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2017h29a_fe_pm_qs.pdf#page=46" rel="noopener" target="_blank">平成 29 年度 秋期 の C 言語</a>の問題の一部を Python に置き換えたものです。
</div>
<style>article{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}@media screen and (max-width:600px){dd{margin-left:1em}ol.background{padding-left:3em!important}}</style>
<h2>問題</h2>
<p>　次の Python プログラムの説明及びプログラムを読んで、設問に答えよ。</p>
<p>〔問題〕</p>
<p>　文字列の中から、回文（ palindrome ）を探して表示する関数 find_palindrome である。回文とは、先頭から読んだ文字の並びと末尾から読んだ文字の並びが一致する文字の並びのことである。ただし、ここでは次の条件を満たすものとする。</p>
<ul class="background c-round">
<li>文字列は英字（ A ～ Z、 a ～ z ）、数字（ 0 ～ 9 ）、記号（ !&#8221;#%&#038;'()*+、-./:+&lt;=>?[]^_{|} ）及び空白文字から成る。</li>
<li>文字の並びを読むとき、英字の大文字と小文字は区別しない。</li>
<li>文字の並びを読むとき、記号及び空白文字は無視する。</li>
<li>回文は英数字で始まり英数字で終わる。ただし、英数字 1 文字は回文ではない。</li>
</ul>
<p>　本問のプログラムが表示する回文の例を表 1 に示す。 No.1 で示す文字列において、文字の並び bc0cb は回文である。 c0c も回文であるが、本問のプログラムでは、文字列の先頭に最も近い文字から始まるものを表示する。また、 No.2 で示す文字列において、英字の大文字と小文字は区別しないので、文字の並び Bc0Cb は回文である。さらに、 No.3 で示す文字列において、英字の大文字と小文字を区別せず、かつ、記号及び空白文字を無視するので、文字の並び B!c0Cb は回文である。 No.4 で示す文字列において、文字列の先頭に最も近い b を先頭文字とする文字の並び bc0cb と bc0cb1bc0cb は、いずれも回文である。しかし、本問のプログラムでは、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</p>
<table class="centered responsive-width">
<caption>表 1　本問のプログラムが表示する回文の例</caption>
<thead>
<tr>
<th>No.</th>
<th>文字列</th>
<th>表示する回文</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>abc0cbe</td>
<td>bc0cb</td>
</tr>
<tr>
<td>2</td>
<td>ABc0CbE</td>
<td>Bc0Cb</td>
</tr>
<tr>
<td>3</td>
<td>AB!c0 CbE</td>
<td>B!c0 Cb</td>
</tr>
<tr>
<td>4</td>
<td>abc0cb1bc0cbe</td>
<td>bc0cb</td>
</tr>
<tbody>
</table>
<ol class="mag_h30">
<li>関数 find_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 text の中から、回文を探して表示する。文字列 text の中に複数の回文がある場合、先頭文字位置が文字列の先頭に最も近いものを表示する。さらに、先頭文字位置が同じ回文が複数あれば、長さが最も短いものを表示する。</dd>
<dt class="chip">引数</dt>
<dd>text	文字列</dd>
</dl>
<p>　関数 find_palindrome は、関数 is_palindrome 及び関数 find_char を使用する。
</li>
<li>関数 is_palindrome の仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字の並び chars の idx 以降が回文かどうかを判定する。</dd>
<dt class="chip">引数</dt>
<dd>chars	文字の並び</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>size	チェックする文字数</dd>
<dt class="chip">返却値</dt>
<dd>回文の場合は 1</dd>
<dd>回文でない場合は 0</dd>
</dl>
</li>
<li>関数find_charの仕様は、次のとおりである。ここで、引数の値に誤りはないものとする。
<dl class="background c-round">
<dt class="chip">機能</dt>
<dd>文字列 st の idx 以降で、文字 ch が最初に現れる位置を求める。ただし、英字の大文字と小文字は区別しない。</dd>
<dt class="chip">引数</dt>
<dd>st	文字列</dd>
<dd>idx	チェックする先頭位置の添え字</dd>
<dd>ch	文字</dd>
<dt class="chip">返却値</dt>
<dd>文字 ch が現れる場合は、それが最初に現れる位置の添え字</dd>
<dd>文字 ch が現れない場合は、 -1</dd>
</dl>
</li>
<li>プログラム中で使用している組み込み関数やメソッドの概要は、次のとおりである。
<dl class="background c-round">
<dt>s.isalnum()</dt>
<dd>文字列sの内容がすべて英数字のとき、Trueを返し、それ以外のとき、Falseを返す。</dd>
<dt>s.lower()</dt>
<dd>文字列sの中にあるすべての英大文字を、英小文字に変換した文字列を返す。</dd>
<dt>print(s, end = &#8220;&#8221;)</dt>
<dd>文字列sを表示して、改行しない。</dd>
</dl>
</li>
</ol>
<p>〔プログラム〕</p>
<div class="background small-text blue-grey-text mag_h30 c-round hide-on-med-and-up">
<i class="material-icons light-blue-text mag_rt05">info</i>編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます
</div>
<pre class="line-numbers"><code class="language-py">def find_palindrome(text):
    for i in range(len(text)):
        if not text[i].isalnum():
            continue
        # ithは、文字列textの第i文字の添え字
        ith = i
        # hitは、第i文字と一致した文字の添え字
        hit = find_char(text, ith + 1, text[ith]) 
        while hit != -1:
            # psizeは、文字の並びの長さ
            psize = "［　　a　　］"
            if is_palindrome(text, ith, psize):
                while ith < hit + 1:
                    print(text[ith], end = "")
                    ith += 1
                print()
                return
            hit = find_char(text, hit + 1, text[ith])

def is_palindrome(chars, idx, size):
    l = idx
    r = idx + size - 1
    while l < r:
        while not chars[l].isalnum():
            l += 1
        while not chars[r].isalnum():
            r -= 1
        if "［　　b　　］":
            return 0
        l += 1
        r -= 1
    return 1

def find_char(st, idx, ch):
    for i in range(idx, len(st)):
        if "［　　c　　］":
          return i
    return -1</code></pre>
<p class="bold">設問</p>
<p>プログラム中の<span class="bold mag_w05">［　　　　　］</span>に入れる正しい答えを、解答群の中から選べ。</p>
<p>a に関する解答群</p>
<pre><code class="language-py">ア　i			
イ　ith			
ウ　ith + 1
エ　hit - ith		
オ　hit - ith + 1</code></pre>
<p>b に関する解答群</p>
<pre><code class="language-py">ア　l == r
イ　1 != r
ウ　chars[l] == chars[r]
エ　chars[l] != chars[r]
オ　chars[l].lower() == chars[r].lower()
カ　chars[l].lower() != chars[r].lower()</code></pre>
<p>c に関する解答群</p>
<pre><code class="language-py">ア　ch == st[i]
イ　ch != st[i]
ウ　ch.lower() == st[i].lower()
エ　ch.lower() != st[i].lower()
オ　(ch == st[i].lower()) or (ch.lower() == st[i])
カ　(ch == st[i].lower()) and (ch.lower() == st[i])</code></pre>
<div class="divider mag_h40"></div>
<h2>解答と解説</h2>
<h3>空欄 a の解説</h3>
<p>表 1 に示された「 abc0cbe 」という文字列から「 bc0cb 」という回文が表示される例を想定して、関数 find_palindrome の処理の流れを追いかけてみましょう。</p>
<ol class="background c-round">
<li>6 行目で、「 abc0cbe 」の先頭の「 a 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の先頭から 1 つ先を起点とした「 bc0cbe 」という文字列から先頭の「 a 」と、同じ文字があるかどうかが関数 find_char で検索されます。<br />この場合は、見つからないので、関数 find_char の戻り値は -1 になり、それ以降にある while 文の処理は行われず、次の文字の処理に進みます。</li>
<li>6 行目で、「 abc0cbe 」の 2 文字目の「 b 」の添え字が変数 ith に格納されます。</li>
<li>8 行目で、「 abc0cbe 」の 2 文字目から 1 つ先を起点とした「 c0cbe 」という文字列から 2 文字目の「 b 」と、同じ文字があるかどうかが関数 find_char で検索されます。</br>この場合は、「 b 」が見つかり、関数 find_char の戻り値は見つかった「 b 」の位置の添え字になり、それ以降の while 文の処理に入ります。</li>
<li>11 行目で変数 psize に空欄 a の値を代入します。
<li>12 行目で変数 psize を関数 is_palindrome の第 3 引数に指定しています。関数の仕様を見ると、第 3 引数は、チェックする文字数です。<br />ここでは、「 abc0cbe 」の「 bc0cb 」という文字の並びが回文かどうかをチェックします。</li>
</ol>
<p>この文字の並びの長さは、「 bc0cb 」の先頭の「 b 」を指す添え字 ith と、末尾の「 b 」を指す添え字 hit の差、プラス 1 で求められます。したがって、空欄 a は、<code class="language-py pad_w05 mag_w05">hit - ith + 1</code>（選択肢オ）です。</p>
<h3>空欄 b の解説</h3>
<p>関数 is_palindrome では、文字列 chars を左端からたどる l と右端からたどる r を 1 つずつ変化させる while 文で、文字列 chars が回文かどうかをチェックしています。</p>
<p>左端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[l]</code>であり、右端からたどった文字は<code class="language-py pad_w05 mag_w05">chars[r]</code>です。</p>
<p>&nbsp;</p>
<p>空欄 b には、関数 is_palindrome が戻り値として 0 を返す条件が入ります。関数 is_palindrome の仕様を見ると、戻り値として 0 を返すのは、文字列 chars が回文でない場合です。</p>
<p>大文字と小文字が違っても同じとみなすので、空欄 b の条件は、小文字に統一して等しくないことをチェックする<code class="language-py pad_w05 mag_w05">chars[l].lower() != chars[r].lower()</code>（選択肢カ）です。</p>
<h3>空欄 c の解説</h3>
<p>関数 find_char は、引数で指定された文字列 st から文字 ch を見つけて、最初に見つかった位置の添え字を返します。</p>
<p>空欄 c は、<code class="language-py pad_w05 mag_w05">st[i]</code>の添え字を返す処理の条件です。大文字と小文字が違っても同じとみなすので、<code class="language-py pad_w05 mag_w05">ch.lower() == st[i].lower()</code>（選択肢ウ）です。</p>
<p>&nbsp;</p>
<div class="chip">解答</div>
<p>空欄 a ― オ<br />
空欄 b ― カ<br />
空欄 c ― ウ</p>
<div class="divider mag_h60 mag_bt30"></div>
<p>いかがでしたか。 Python のプログラムを読み取って、問題を解けましたか？</p>
<p>もしも、プログラミングの学習を始めたばかりなら、スラスラできなくても当然です。同じ問題を、何度も繰り返し練習してください。時間はかかるかもしれませんが、必ずできるようになります。</p>
<p>この連載は、今回で最終回になります。これまで連載をお読みいただいた皆様に、この場をお借りして、厚く御礼申し上げます。</p>
<p>またどこかでお会いしましょう！</p>
<p>&nbsp;</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/learn_python/practice/">基本情報ではじめる Python 最終回 試験問題レベルにチャレンジ</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕アルゴリズム  文字列の誤りの検出 2017 年度 秋期</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_algorithm/</link>
		<pubDate>Fri, 05 Nov 2021 02:30:59 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=6176</guid>
		<description><![CDATA[<p>今週の午後問題 このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「文字列の誤りの検出」でしたが、皆さん、手応えは [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_algorithm/">今週の午後問題〔解答〕アルゴリズム  文字列の誤りの検出 2017 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<div class="chip indigo white-text">今週の午後問題</div>
<p>このコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../h29a_algorithm/">「文字列の誤りの検出」</a>でしたが、皆さん、手応えはいかがでしょうか?</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}blockquote > p{color:#607d8b}pre{font-size:1em;padding:1em;background:#eeeeee;}pre,article,code{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2017 年度 秋期 文字列の誤りの検出</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>calcCheckCharacter 関数において、論理型の変数 is_even は、<span class="u">変数名から「偶数（ even ）であるか（ is ）」を意味している</span>ことがわかります。</p>
<p>is_even が空欄 a1 と等しいとき、単に文字の値を足す処理を行っています。説明文に</p>
<blockquote><p>偶数番目の文字に割り当てた数値は、そのまま全て足し合わせる</p></blockquote>
<p>とあるので、空欄 a1 は true です。</p>
<p>validateChackCharacter 関数において、論理型の変数 is_odd は、<span class="U">変数名から「奇数（ odd ）であるか（ is ）」を意味している</span>ことがわかります。</p>
<p>is_odd が空欄 a2 と等しいとき、単に文字の値を足す処理を行っています。説明文に</p>
<blockquote><p>奇数番目の文字に割り当てた数値は、そのまま全て足し合わせる</p></blockquote>
<p>とあるので、空欄 a2 は true です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>空欄 b の前にある繰り返し処理で、変数 sum に、説明文の</p>
<blockquote><p>03.　01 と 02 の結果を足し合わせる</p></blockquote>
<p>の結果が得られます。</p>
<p>したがって、空欄 b は、説明文の</p>
<blockquote><p>04.　N から 、 03 で求めた総和を N で割った余りを引く。さらにその結果を、 N で割り、余りを求める</p></blockquote>
<p>に該当します。</p>
<p>したがって、空欄 b は、 (N &#8211; sum  %  N) % N です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>c</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>変数 ret_value は、 validateCheckCharacter 関数の戻り値です。空欄 c の条件が true のとき、 ret_value に false が格納されています。</p>
<p>したがって、<span class="u">空欄 c には、検査文字付文字列に誤りがある条件が入ります</span>。説明文に</p>
<blockquote><p>04.　03 で求めた総和が N で割り切れる場合は、検査文字付文字列に誤りがないと判定する。 N で割り切れない場合は、検査文字付文字列に誤りがあると判定する</p></blockquote>
<p>とあるので、空欄 c は、 sum % N ≠ 0 です。割り切れないことは、割り算の余りが 0 でないことで判断できます。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>d</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>説明文に、</p>
<blockquote><p>複数文字に誤りがある場合には、誤りがないと判定されることがある</p></blockquote>
<p>とあるので、 ipa␣␣f に対して、複数文字に誤りがある api␣␣f （ケース 2 ）、 pia␣␣f （ケース 3 ）、 ␣␣apif （ケース 4 ）を検証します。</p>
<dl class="inline">
<dt>文字</dt>
<dd>数値</dd>
<dt>_</dt>
<dd>0</dd>
<dt>i</dt>
<dd>12</dd>
<dt>p</dt>
<dd>19</dd>
<dt>a</dt>
<dd>4</dd>
<dt>f</dt>
<dd>9</dd>
</dl>
<dl class="inline">
<span class="u">api␣␣f （ケース 2 ）の検証</span></p>
<dt>f</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>9</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0</dd>
<dt>i</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>12 × 2 = 24 、24 ÷ 30 = 0 あまり 24 、 0 + 24 = 24</dd>
<dt>p</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>19</dd>
<dt>a</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>4 × 2 = 8 、8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8</dd>
</dl>
<p>すべてを足し合わせると、<br />
9 + 0 + 0 + 24 + 19 + 8 = 60</p>
<p>60 は N = 30 で割り切れるので、誤りがあるのに、誤りがないと判断されます。</p>
<dl class="inline">
<span class="u">pia␣␣f （ケース 3 ）の検証</span></p>
<dt>f</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>9</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0</dd>
<dt>a</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>4 × 2 = 8 、 8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8</dd>
<dt>i</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>12</dd>
<dt>p</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>19 × 2 = 38 、 38 ÷ 30 = 1 あまり 8 、 1 + 8 = 9</dd>
</dl>
<p>すべてを足し合わせると、<br />
9 + 0 + 0 + 8 + 12 + 9 = 38</p>
<p>38 は N = 30 で割り切れないので、誤りがあると適切に判断されます。</p>
<dl class="inline">
<span class="u">␣␣apif （ケース 4 ）の検証</span></p>
<dt>f</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>9</dd>
<dt>i</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>12 × 2 = 24 、 24 ÷ 30 = 0 あまり 24 、 0 + 24 = 24</dd>
<dt>p</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>19</dd>
<dt>a</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>4 × 2 = 8 、 8 ÷ 30 = 0 あまり 8 、 0 + 8 = 8</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0 × 2 = 0 、 0 ÷ 30 = 0 あまり 0 、 0 + 0 = 0</dd>
</dl>
<p>すべてを足し合わせると、<br />
9 + 24 + 19 + 8 + 0 + 0 = 60</p>
<p>60 は N = 30 で割り切れるので、誤りがあるのに、誤りがないと判断されます。</p>
<p>したがって、誤りがあるのに誤りがないと判断されるのは、ケース 2 とケース 4 です（選択肢オ）。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 3</span>e</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>5 列目を縦に見た ␣s␣␣ という文字列の検査文字を求めます。</p>
<dl class="inline">
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0 × 2  = 0 、 0 ÷ 2 = 0 あまり 0 、 0 + 0 = 0</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0</dd>
<dt>s</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>22 × 2  = 44 、 44 ÷ 30 = 1 あまり 14 、1 + 14 = 15</dd>
<dt>␣</dt>
<dd><i class="material-icons mag_rt05">more_horiz</i>0</dd>
</dl>
<p>すべてを足し合わせると、<br />
0 + 15 + 0 + 0 = 15</p>
<p>30 から、 15 を 30 で割った余りの 15 を引くと、<br />
30 &#8211; 15 = 15</p>
<p>この 15 を 30 で割った余りの 15 に対応する l （選択肢ウ）が検査文字になります。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 4</span>f</p>
<p><span class="chip bold">正解</span> カ</p>
<div class="divider"></div>
<p>表 4 のケースには、すべて 1 文字以上の誤りがあります。したがって、図 3 の 1 行目に、表 4 のどのケースを入れても、縦方向で 1 文字の誤りが生じる部分が 1 か所以上生じます。</p>
<p>関数 validateCheckCharacter は、誤りが 1 文字であれば、誤りを検出できます。そして、 1 つでも誤りがあると判定された場合は、検査文字列表に誤りがあると判定するのですから、検査文字付表に誤りがないと判定されるケースは、ありません（選択肢カ）。
</p></div>
<h2>みんなの解答</h2>
<p>ご解答いただいた皆さん、ありがとうございました！</p>
<p>手応えはいかがでしたでしょうか?</p>
<p>&nbsp;</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2018h29a_fe_pm_cmnt.pdf#page=3" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
　問 8 では，検査文字を利用した文字列の誤り検出について出題した。<br />
　設問 1 では， a の正答率は低く，あまり理解されていなかった。プログラムの説明から， is_even の値及び is_odd の値と文字の順番との関係が理解できれば，正答できた。 b ， c の正答率は平均的で，おおむね理解されていた。<br />
　設問 2 と設問 3 の正答率は平均的で，おおむね理解されていた。<br />
　設問 4 の正答率は低く，あまり理解されていなかった。いずれのケースでも， &#8220;ipa␣␣f&#8221; と文字が異なる列位置において，図 3 の縦方向の文字列は，図 2 の縦方向の検査文字付文字列に対して 1 文字誤りがある。このことが分かれば，正答できた。<br />
　実務において，文字列の誤りを検出するプログラムはよく利用されるが，誤りを検出できないケースがあることも理解しておいてほしい。このことを踏まえた上で，用途に応じて適切な検出プログラムを適用する能力が求められるので，身につけておいてほしい。
</div>
<p>2022 年度 下期試験向け今週の午後問題はこれで終了です！　この連載が過去問題に演習で使われることを願っています !!</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_algorithm/">今週の午後問題〔解答〕アルゴリズム  文字列の誤りの検出 2017 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕アルゴリズム  ヒープの性質を利用したデータの整列 2018 年度 春期</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30h_algorithm/</link>
		<pubDate>Thu, 28 Oct 2021 23:30:32 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=6149</guid>
		<description><![CDATA[<p>今週の午後問題 このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「ヒープの性質を利用したデータの整列」でしたが、 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30h_algorithm/">今週の午後問題〔解答〕アルゴリズム  ヒープの性質を利用したデータの整列 2018 年度 春期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<div class="chip indigo white-text">今週の午後問題</div>
<p>このコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../h30h_algorithm/">「ヒープの性質を利用したデータの整列」</a>でしたが、皆さん、手応えはいかがでしょうか?</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}blockquote > p{color:#607d8b}pre{font-size:1em;padding:1em;background:#eeeeee;}pre,article,code{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2018 年度 春期 ヒープの性質を利用したデータの整列</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>heap の末端に追加されたデータは、そのデータが親より大きい限り、データと親を交換することを繰り返します。</p>
<p>したがって、空欄 a は、「データ ＞ 親」を意味する heap[k] > heap[parent(k)] が適切です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>heap[k] と heap[parent(k)] の値を交換するので、 <code>swap(heap, h, parent(k))</code> が適切です。</p>
<p>空欄 b には、 parent(k) が入ります。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>c</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>1 回目の処理では、 last = 6 であり副プログラム swap によって、 heap[0] の 60 と、 heap[6] の 20 が交換されます。</p>
<p>したがって、 heap[0] の値は、 20 になります。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>d</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>この部分の説明は、副プログラム downHeap の 7 行目の</p>
<pre>heap[tmp] ≦ heap[rchild(n)]</pre>
<p>に該当します。 5 行目で tmp に lchild(n) を代入しているので、 7 行目は </p>
<pre>heap[lchild(n)] ≦ heap[rchild(n)]</pre>
<p>と同じです。</p>
<p>したがって、</p>
<blockquote><p>右側の子が左側の子以上のときには</p></blockquote>
<p>という条件になります。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>e</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>1 回目の処理では、 heap[0] の左側の子が heap[1] = 30 で、右側の子が heap[2] = 45 です。</p>
<pre>| ▲ heap[tmp] > heap[n]
| | ･ swap (heap, n, tmp)
| +---
| | ･ return                /* downHeap から抜ける */
| ▼
| ･ n ← tmp</pre>
<p>これは、</p>
<blockquote><p>右側の子が左側の子以上のときには</p></blockquote>
<p>という条件に一致するので、 15 行目では tmp に右側の子の要素番号の 2 が格納されています。
</p></div>
<h2>みんなの解答</h2>
<p>ご解答いただいた皆さん、ありがとうございました！</p>
<p>手応えはいかがでしたでしょうか?</p>
<p>&nbsp;</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_cmnt.pdf#page=3" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
　問 8 では，整数型のデータを，ヒープの性質を満たすように配列に格納（ヒープを配列で実現）する処理，配列に格納した整数型のデータをヒープソートで昇順に整列する処理について出題した。<br />
　設問 1 の正答率は平均的で，おおむね理解されていた。ヒープの構造と配列 heap に格納されるデータの関係を理解し，配列 heap にデータを追加する位置が，対応する親の値との関係で，どのように決まるのかを理解すれば，正答できた。<br />
　設問 2 では， c の正答率は平均的で，おおむね理解されていた。プログラムの動作の説明と配列に格納されているデータを対応付ければ，正答できた。 d， e の正答率は低く，あまり理解されていなかった。d  ではウと， e ではオと誤って解答した受験者が見受けられた。 d は，副プログラム downHeap の行番号 5 ～ 10 で使われている変数及び関数と行番号 7 の条件式で使われている関係演算子に着目すれば，正答できた。 e は，変数 n の値が 0 で配列 heap の要素番号 1 ～ 5 の内容が図 2 のとおりであることに着目して，副プログラム downHeap の行番号 5 ～ 10 の処理を追跡すれば，正答できた。<br />
　プログラムでアルゴリズムが正しく実現されていることを確認するためには，プログラムの説明とプログラム中で使用されている変数の意味や処理の条件を対応付けてプログラムの動きを追跡する能力が求められるので，身につけておいてほしい。
</div>
<p>来週は「アルゴリズム特集」の最終問題です！　試験期間が残りわずかになるので、腕試ししてみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30h_algorithm/">今週の午後問題〔解答〕アルゴリズム  ヒープの性質を利用したデータの整列 2018 年度 春期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕アルゴリズム  整数式の解析と計算 2018 年度 秋期</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30a_algorithm/</link>
		<pubDate>Fri, 22 Oct 2021 02:30:53 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=6112</guid>
		<description><![CDATA[<p>今週の午後問題 このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「整数式の解析と計算」でしたが、皆さん、手応えは [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30a_algorithm/">今週の午後問題〔解答〕アルゴリズム  整数式の解析と計算 2018 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<div class="chip indigo white-text">今週の午後問題</div>
<p>このコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../h30a_algorithm/">「整数式の解析と計算」</a>でしたが、皆さん、手応えはいかがでしょうか?</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}dl.inline dd{margin-left:2em}blockquote > p{color:#607d8b}pre,code{font-size:1em;padding:1em;line-height:1.8;background:#eeeeee;position:relative;}article,pre,code{font-family:'consolas','Courier New',"HCo Gotham SSm",Gotham,"ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,sans-serif!important;}.encircled-number{color:white;background:#2196f3;padding:.2em .5em;font-size:1em;border-radius:50%;}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2018 年度 秋期 整数式の解析と計算</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>演算の優先順位を示す Priority[] には、変数 nest の値が格納されます。 nest の初期値を 0 として、加減算なら nest を + 1 し、そうでないなら（乗除算なら） nest を + 2 します。</p>
<p class="background c-round blue-grey-text small-text hide-on-med-and-up mag_h10">
<i class="material-icons light-blue-text mag_rt05">info</i>スマートフォンをご覧の際、プログラムは右にスクロールできます
</p>
<pre>| | ▲ (chr = '+') or (chr = '-')
| | | ･ Priority[OpCnt] ← nest + 1
| |-+-----
| | | ･ Priority[OpCnt] ← nest + 2
| | ▼</pre>
<p><span class="encircled-number">3</span> の部分では、開きカッコなら nest を + 10 し、閉じカッコなら nest を &#8211; 10 しています。</p>
<pre>| ▲ chr = '('
| | ･ nest ← nest + 10
| ▼
| ▲ chr = ')'
| | ･ nest ← nest – 10
| ▼</pre>
<p>これは、<span class="u">カッコで囲まれた演算を優先させるため</span>です。</p>
<p>カッコで囲まれた加減算を乗除算より優先させるためには、 3 以上の優先順位を付ける必要があります。加減算であることで + 1 されるので、さらに + 2 以上にすれば、 3 以上の優先順位になります。</p>
<p>したがって、イの 2 以上が正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>priLow は加減算の優先順位を示す値で、 priHigh は乗除算の優先順位を示す値です。</p>
<p>カッコの優先順位の値は、</p>
<pre>priLow + カッコの優先順位の値 > priHigh</pre>
<p>になればよいので、</p>
<pre>カッコの優先順位の値 > priHigh - priLow</pre>
<p>です。</p>
<p>priHigh &#8211; priLow より大きいのですから、 priHigh &#8211; priLow + 1 以上です。</p>
<p>したがって、エが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>c</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p><span class="chip"><i class="material-icons blue-text mag_rt05">code</i>プログラム（計算処理の部分）</span>の <span class="encircled-number">5</span> 、<span class="encircled-number">6</span> 、および <span class="encircled-number">7</span> のループは、最も優先順位が高い演算の要素番号を ip に得る処理を行っています。</p>
<pre>| ■ i: 1, i &lt; OpCnt, 1
| | ▲ Priority[ip] &lt; Priority[i]
| | | ･ ip ← i
| | ▼
| ■</pre>
<p><span class="encircled-number">7</span> の条件は、 <code>Priority[ip] &lt; Priority[i]</code> なので、<span class="u">同じ優先順位の演算を後で見つけても、前にある演算が優先され左から演算</span>されます。</p>
<p>この部分を <code>Priority[ip] ≦ Priority[i]</code> にすれば、同じ（ = ）優先順位の演算を後で見つけると、後にある演算が優先され右から演算されます。</p>
<p>したがって、エが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>d</p>
<p><span class="chip bold">正解</span> ア</p>
<div class="divider"></div>
<p>同じ演算が並んでいる部分を左から演算しても右から演算しても同じ結果になるのは、 + と × です。 + と × だけが並んでいるのは、ケース 1 だけです。</p>
<p>したがって、アが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold">設問 3</p>
<p><span class="mag_rt10">e</span><span class="chip bold">正解</span> エ</p>
<p><span class="mag_rt10">f</span><span class="chip bold">正解</span> イ</p>
<p><span class="mag_rt10">g</span><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p>問題文に示された　2　×　(-1) という計算式を <span class="chip"><i class="material-icons blue-text mag_rt05">code</i>プログラム（解析処理の部分）</span> で処理した結果は、以下のようになります。 [?] は、配列の要素に値が格納されていないことを示します。</p>
<pre>Expression	[2] [×] [(] [-] [1] [)] 
Value[]         [2] [0] [1] [?] [?] [?] 
Operator[]	[×] [-] [?] [?] [?] [?]   OptCnt[2] 
Priority[]	[2] [11] [?] [?] [?] [?]  nest[1]</pre>
<p>Value[] の左から 2 つ目の要素は [0] です。したがって、空欄 f の正解はイです。</p>
<p>OptCnt の値は 2 です。したがって、空欄 g の正解はエです。</p>
<p><span class="chip"><i class="material-icons blue-text mag_rt05">code</i>プログラム（解析処理の部分）</span>で処理した結果は、 Priority[] の値の大きい順に、その位置にある演算が行われます。</p>
<p>まず、 0 &#8211; 1 という演算が行われ、結果として -1 が得られます。<br />
次に、 2 × -1 という演算が行われ、結果として -2 が得られます。これは、 2 × （-1） という計算式の正しい演算結果です。</p>
<p>したがって、空欄 e の正解はエです。
</p></div>
<h2>みんなの解答</h2>
<p>ご解答いただいた皆さん、ありがとうございました！</p>
<p>手応えはいかがでしたでしょうか?</p>
<p>&nbsp;</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_2/2018h30a_fe_pm_cmnt.pdf#page=3" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background grey-text c-round">
　問 8 では，整数式を受け取って，その値を返すプログラムを題材に，配列を用いた基本的な文字処理及び数値処理について出題した。<br />
　設問 1 では， a の正答率は平均的で，おおむね理解されていた。 b の正答率は低く，あまり理解されていなかった。括弧内の加減算の優先順位が，括弧外の乗除算の優先順位よりも高ければよいことに着目すれば，正答できた。<br />
　設問 2 の正答率は低く，あまり理解されていなかった。 c では，ウと誤って解答した受験者が見受けられた。ウの場合，行 <span class="encircled-number">5</span> で ip に設定する値が 0 のままでは，正しい処理ができない。 d では，ウと誤って解答した受験者が多く見受けられた。括弧内の減算の結果が変わることを見落としたものと思われる。<br />
　設問 3 では， g の正答率は平均的で，おおむね理解されていた。 e と f の正答率は低く，あまり理解されていなかった。 e ではイと， f ではウと誤って解答した受験者が多く見受けられた。図 3 の式について， <span class="chip"><i class="material-icons blue-text mag_rt05">code</i>プログラム（解析処理の部分）</span> の動作を追跡すれば，正答できた。<br />
　プログラム中の定数をより一般的な表現に拡張できる能力，及びプログラムの動作を実際に追跡できる能力は重要なので，身につけておいてほしい。
</div>
<p>来週もひきつづき「アルゴリズム問題」を出題します！　多くの方が苦手にしがちなので、これを機会にじっくり挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h30a_algorithm/">今週の午後問題〔解答〕アルゴリズム  整数式の解析と計算 2018 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕アルゴリズム ハフマン符号化を用いた文字列圧縮 2019 年度 春期</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h31h_algorithm/</link>
		<pubDate>Fri, 15 Oct 2021 02:30:43 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[アルゴリズム]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=6070</guid>
		<description><![CDATA[<p>今週の午後問題 このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「 ハフマン符号化を用いた文字列圧縮」でしたが、 [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h31h_algorithm/">今週の午後問題〔解答〕アルゴリズム ハフマン符号化を用いた文字列圧縮 2019 年度 春期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<div class="chip indigo white-text">今週の午後問題</div>
<p>このコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../h31h_algorithm/">「 ハフマン符号化を用いた文字列圧縮」</a>でしたが、皆さん、手応えはいかがでしょうか？</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}dl.inline dd{margin-left:2em}blockquote > p{color:#607d8b}article,code{font-family:"Courier New","HCo Gotham SSm","Gotham","ヒラギノ角ゴ Pro W3","Hiragino Kaku Gothic ProN","Hiragino Sans","BIZ UDPGothic",Meiryo,"sans-serif"!important;}.background>p{color:#607d8b;}@media screen and (min-width:601px){.responsive-width{width:60%}}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2019 年度 春期 ハフマン符号化を用いた文字列圧縮</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> ア</p>
<div class="divider"></div>
<p>&#8220;ABBBBBBBCCCDD&#8221; という文字列のハフマン木は、以下のようになります。</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h31h_q8_ans_figure.jpg" loading="lazy"><br />
</figure>
<p>このハフマン木をたどると、それぞれの文字のビット表現は、<br />
&#8220;A&#8221; が 010<br />
&#8220;B&#8221; が 1<br />
&#8220;C&#8221; が 00<br />
&#8220;D&#8221; が 011<br />
なので、選択肢アが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>&#8220;A&#8221; ～ &#8220;D&#8221; のそれぞれを 2 ビットの固定長で表現すると、<br />
&#8220;ABBBBBBBCCCDD&#8221;<br />
という 13 文字の文字列は、</p>
<p class="curie-new">2 ビット × 13 文字 ＝ 26 ビット</p>
<p>になります。</p>
<p>1 文字ある &#8220;A&#8221; が 3 ビット、<br />
7 文字ある &#8220;B&#8221; が 1 ビット、<br />
3 文字ある &#8220;C&#8221; が 2 ビット、<br />
2 文字ある &#8220;D&#8221; が 3 ビット<br />
のハフマン符号で表現すると、</p>
<p class="curie-new">3 ビット × 1 文字 ＋ 1 ビット × 7 文字 ＋ 2 ビット × 3 文字 ＋ 3 ビット × 2 文字 ＝ 22 ビット<br />
になります。</p>
<p>したがって、圧縮率は、</p>
<p class="curie-new">22 ビット ÷ 26 ビット ≒ 0.85</p>
<p>であり、選択肢イが正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>c</p>
<p><span class="chip bold">正解</span> ウ</p>
<div class="divider"></div>
<p>空欄 c の直前で、 SortNode が呼び出され、出力として、 node[] に親が作成されていない節を表す要素組の要素番号を格納した配列が設定され、 nsize に node[] の要素数が設定されます。</p>
<pre><code class="language-none">• SortNode(size, parent, freq, nsize, node)
■ "[   c   ]"
| ･ i ← node[0]    /* 最も小さい値をもつ要素組の要素番号 */
| ･ j ← node[1]    /* 2 番目に小さい値をもつ要素組の要素番号 */
| ･ left[size] ← i
| ･ right[size] ← j
| ･ freq[size] ← freq[i] + freq[j] /* 子の値の合計 */
| ･ parent[i] ← size   /* 子に親の節の要素番号を格納 */
| ･ parent[j] ← size   /* 子に親の節の要素番号を格納 */
| ･ size + size + 1
| ･ SortNode(size, parent, freq, nsize, node)
■</code></pre>
<p>空欄 c の条件が真である限り繰り返される処理では、 node[0] と node[1] の要素組の要素番号を取り出して処理を行っています。</p>
<p>nsize の値が 2 以上でなければ、この処理を行えないので、空欄 c は、選択肢ウの nsize ≧ 2 が正解です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 2</span>d</p>
<p><span class="chip bold">正解</span> ア</p>
<div class="divider"></div>
<p>〔プログラム 1 の説明〕の 4. に、</p>
<blockquote><p>行番号 19 ～ 24 で親が作成されていない節を表す要素組の要素番号を抽出し</p></blockquote>
<p>とあります。</p>
<p>親が作成されていないことは、 parent[i] の値が -1 であることで判断できます。選択肢の中で、これに該当するのは、選択肢エの parent[i] &lt; 0 です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 3</span>e</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<p>〔プログラム 2 の説明〕の 3. に、</p>
<blockquote><p>副プログラム Encode は，行番号 2 の条件が成り立つとき，副プログラム Encode を再帰的に呼び出す。これによって，ハフマン木を葉から根までたどっていく。</p></blockquote>
<p>とあります．これは、<span class="u">親が根でない限り、 Encode の再帰的な呼び出しを繰り返すということ</span>です。</p>
<p>親が根であるないことは、 parent[k] の値が -1 でないことで判断できます。選択肢の中で、これに該当するのは、選択肢オの parent[k] ≧ 0 です。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 3</span>f</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>空欄 f の条件が真のとき &#8220;0&#8221; を表示します。これは、根から葉の方向にたどっていくときに、<span class="u">現在の節が親の左側のとき</span>です。</p>
<p>親の要素番号は、 parent[k] です。その親の左側の要素番号は、 left[parent[k]] です。</p>
<p>これが、現在の節の要素番号 k と等しければ、現在の節が親の左側なので、その条件は、 left[parent[k]] ＝ k であり、選択肢イが正解です。
</p></div>
<h2>みんなの解答</h2>
<p>ご解答いただいた皆さん、ありがとうございました！</p>
<p>手応えはいかがでしたでしょうか？</p>
<p>&nbsp;</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31_1/2019h31h_fe_pm_cmnt.pdf#page=3" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background blue-grey-text c-round">
　問 8 では，ハフマン符号化を題材に，簡単な例での圧縮率の計算，配列で表現したハフマン木を作成する処理，及びハフマン木から文字のビット表現を作成して表示する再帰処理について出題した。 </p>
<p>　設問 1 では， a の正答率は高く，よく理解されていた。 b の正答率は低く，あまり理解されていなかった。ウと誤って解答した受験者が見受けられた。圧縮前の文字列のビット長は，文字数と各文字のビット表現のビット長である 2 との積で求められる。また，圧縮後の文字列のビット長は，文字のビット表現のビット長が文字の出現回数の多い順に 1 ビット， 2 ビット， 3 ビット， 3 ビットであり，文字の出現回数とその文字のビット長との積の総和で求められることが分かれば，正答できた。 </p>
<p>　設問 2 では， c の正答率は低く，あまり理解されていなかった。この繰返しの処理では，親が作成されていない二つの節から，親の節を作成すること，及び副プログラム SortNode が出力する nsize は，整列対象とした節の個数，すなわち親が作成されていない節の個数であることに気がつけば，正答できた。 d の正答率は低く，あまり理解されていなかった。キと誤って解答した受験者が見受けられた。副プログラムSortNodeは，親が作成されていない節を抽出する，すなわち配列 parent の要素の値が -1 の節を抽出することに気がつけば，正答できた。 </p>
<p>　設問 3 では， e の正答率は低く，あまり理解されていなかった。副プログラム Encode は葉から根まで再帰処理でたどる，すなわち根でなければ再帰処理を続けることに気がつけば，正答できた。 f の正答率は低く，あまり理解されていなかった。エと誤って解答した受験者が見受けられた。現在の節が親の左側の子であるということは，親の要素番号をもつ要素組の左側の子の要素番号が現在の要素番号と同じであるという条件に気がつけば，正答できた。 </p>
<p>　プログラムの作成においては，アルゴリズム及びプログラムの仕様を理解し，条件分岐や繰返しの条件を正しく実装する能力が，使用するプログラム言語を問わず求められるので，身につけておいてほしい。
</p></div>
<p>来週もひきつづき「アルゴリズム問題」を出題します！　多くの方が苦手にしがちなので、これを機会にじっくり挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h31h_algorithm/">今週の午後問題〔解答〕アルゴリズム ハフマン符号化を用いた文字列圧縮 2019 年度 春期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
		<item>
		<title>今週の午後問題〔解答〕情報セキュリティ SSH による通信 2017 年度 秋期</title>
		<link>https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_sec/</link>
		<pubDate>Fri, 08 Oct 2021 02:30:29 +0000</pubDate>
		<dc:creator><![CDATA[基本情報技術者試験 受験ナビ 編集部]]></dc:creator>
				<category><![CDATA[公開鍵秘密鍵]]></category>
		<category><![CDATA[午後問題の解説]]></category>
		<category><![CDATA[情報セキュリティ]]></category>
		<category><![CDATA[過去問演習]]></category>

		<guid isPermaLink="false">https://www.seplus.jp/dokushuzemi/fe/fenavi/?post_type=this_weeks_exercise&#038;p=6003</guid>
		<description><![CDATA[<p>今週の午後問題 このコーナーでは毎週月曜に午後の必須選択問題から 1 問ピックアップして出題し、 解答欄 を設け、読者の皆さまにも解答してもらっています！ 今週の午後問題は「 SSH による通信」でしたが、皆さん、手応え [&#8230;]</p>
<p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_sec/">今週の午後問題〔解答〕情報セキュリティ SSH による通信 2017 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></description>
				<content:encoded><![CDATA[<div class="background c-round">
<div class="chip indigo white-text">今週の午後問題</div>
<p>このコーナーでは<span class="u">毎週月曜に午後の必須選択問題から 1 問ピックアップして出題</span>し、 解答欄 を設け、読者の皆さまにも解答してもらっています！</p>
<p>今週の午後問題は<a href="../h29a_sec/">「 SSH による通信」</a>でしたが、皆さん、手応えはいかがでしょうか？</p>
<p>金曜になりましたので、<span class="u">出題の 解答 と 矢沢久雄さんによる 解説 に加えて、皆さんの正解率を公開</span>します。
</div>
<style>.sub-title{font-size:.9em}dl.inline dd{margin-left:2em}blockquote > p{color:#607d8b}.background>p{color:#607d8b;}</style>
<h2>今週の午後問題<br />
<span class="grey-text sub-title">2017 年度 秋期 SSH による通信</span></p>
<p class="pink chip white-text sub-title">解答と解説</p>
</h2>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>a</p>
<p><span class="chip bold">正解</span> エ</p>
<div class="divider"></div>
<p><span class="u">ディジタル署名は、署名者の秘密鍵を使って署名し、署名者の公開鍵を使って検証</span>します。</p>
<p>ここでは、署名者がサーバなので、クライアントが</p>
<blockquote><p>サーバの公開鍵（選択肢エ）</p></blockquote>
<p>を使ってディジタル署名の検証をします。
</p></div>
<div class="background c-round">
<p><span class="bold mag_rt10">設問 1</span>b</p>
<p><span class="chip bold">正解</span> イ</p>
<div class="divider"></div>
<p>ここでは、署名者がクライアントなので、サーバが</p>
<blockquote><p>クライアントの公開鍵（選択肢イ）</p></blockquote>
<p>を使ってディジタル署名の検証をします。
</p></div>
<div class="background c-round">
<p class="bold">設問 2</p>
<p><span class="chip bold">正解</span> オ</p>
<div class="divider"></div>
<dl class="inline">
サーバによるセッション識別子のディジタル署名を検証するので、サーバとクライアントの間に悪意のある第三者が入ってなりすましをする</p>
<blockquote><p>中間者攻撃（選択肢オ）</p></blockquote>
<p>を防ぐことができます。
</p></div>
<div class="background c-round">
<p class="bold">設問 3</p>
<p><span class="chip bold">正解</span> ア</p>
<div class="divider"></div>
<p><span class="u">共通鍵暗号方式には、処理が高速という長所がありますが、鍵をネットワークで送れないという短所があります</span>。<br />
<span class="u">公開鍵暗号方式には、処理が低速という短所がありますが、一方の鍵をネットワークで送れるという長所があります</span>。</p>
<p>ここでは、公開鍵暗号方式ではなく共通鍵暗号方式を用いる理由を答えるので、</p>
<blockquote><p>共通鍵暗号方式は、公開鍵暗号方式よりも暗号処理が高速である（選択肢ア）</p></blockquote>
<p>が適切です。
</p></div>
<div class="background c-round">
<p class="bold">設問 4</p>
<p><span class="chip bold">正解</span> ア</p>
<div class="divider"></div>
<p>パスワード認証では、パスワードがサーバに送られますが、<span class="u">公開鍵認証では、パスワードがサーバに送られません</span>。</p>
<p>したがって、パスワード認証が公開鍵認証に比べて安全性が低い理由として適切なのは、</p>
<blockquote><p>サーバが攻撃者に乗っ取られていた場合、送信したパスワードを攻撃者に取得されてしまう（選択肢ア）</p></blockquote>
<p>です。</p>
<p>&nbsp;</p>
<p>正当なサーバとは異なるサーバに接続させられても利用者が気づけないことは、パスワード認証と公開鍵認証の違いには関係しないので、選択肢イは不適切です。</p>
<p>公開鍵認証では、パスワードを使わないので、選択肢ウは不適切です。</p>
<p>SSH セッションでは、暗号化通信でパスワード認証を行うので、パスワードが平文でネットワークを流れることはありません。したがって、選択肢エは不適切です。
</p></div>
<h2>みんなの解答</h2>
<p>ご解答いただいた皆さん、ありがとうございました！</p>
<p>では、正解率はいかがだったでしょうか？</p>
<figure>
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h29a_sec_1a.jpg" loading="lazy"><br />
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h29a_sec_1b.jpg" loading="lazy"><br />
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h29a_sec_2.jpg" loading="lazy"><br />
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h29a_sec_3.jpg" loading="lazy"><br />
<img class="materialboxed z-depth-5 responsive-width" src="../../wp-content/uploads/2021/10/h29a_sec_4.jpg" loading="lazy"><br />
</figure>
<p>&nbsp;</p>
<p>なお、以下はこの問題の <a href="https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2017h29_2/2017h29a_fe_pm_cmnt.pdf" rel="noopener" target="_blank">IPA の講評</a>です。今後の参考になれば幸いです。</p>
<div class="background blue-grey-text c-round">
　問 1 では， SSH を題材に，暗号による安全な通信経路の確立や，利用者の認証について出題した。 </p>
<p>　設問 1 の正答率は平均的で，おおむね理解されていた。 </p>
<p>　設問 2 の正答率は低く，あまり理解されていなかった。ウと誤って解答した受験者が見受けられた。これは，解答群にあるような代表的な攻撃に関する理解が不十分であるためと思われる。代表的な攻撃について，その方法及び対策を，理解しておいてほしい。 </p>
<p>　設問 3 の正答率は平均的で，おおむね理解されていた。 </p>
<p>　設問 4 の正答率は低く，あまり理解されていなかった。エと誤って解答した受験者が見受けられた。 &#8220;パスワード認証&#8221; ではサーバに送られるものが &#8220;パスワード&#8221; であるのに対して， &#8220;公開鍵認証&#8221; ではサーバに送られるものは &#8220;公開鍵&#8221; である点に着目すれば，正答できた。 </p>
<p>　暗号を使った通信ソフトウェアを利用するに当たり，各暗号技術の特性を理解した上で，通信ソフトウェアで，どのような暗号がどのように用いられ，どのような役割を担っているかを正しく把握できる能力が求められるので，身につけておいてほしい。
</p></div>
<p>来週からは「アルゴリズム問題」を特集します！　多くの方が苦手にしがちなので、これを機会にじっくり挑戦してみてください！</p><p>The post <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi/this_weeks_exercise/ans_h29a_sec/">今週の午後問題〔解答〕情報セキュリティ SSH による通信 2017 年度 秋期</a> first appeared on <a href="https://www.seplus.jp/dokushuzemi/ec/fe/fenavi">基本情報技術者試験 受験ナビ｜科目A・科目B対策から過去問解説まで 250本以上の記事を掲載</a>.</p>]]></content:encoded>
			</item>
	</channel>
</rss>
