<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>アルゴリズム on Miura Computer Club</title>
    <link>/tags/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/</link>
    <description>Recent content in アルゴリズム on Miura Computer Club</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja-JP</language>
    <lastBuildDate>Thu, 23 Jul 2026 07:00:00 +0900</lastBuildDate><atom:link href="/tags/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>レッスン106</title>
      <link>/lessons/lesson106/</link>
      <pubDate>Thu, 23 Jul 2026 07:00:00 +0900</pubDate>
      
      <guid>/lessons/lesson106/</guid>
      <description>アルゴリズム入門（探索） レッスン104で学んだようにある課題に対してそれを解決するための処理手順のことを「アルゴリズム」といいます。
今回は探索のアルゴリズムをフローチャートを使って学び、フローチャートに基づいてプログラムを作成してみましょう。
探索あるいは検索とは、データの集合の中から目的の要素を探し出す処理です。
線形探索 線形探索は、配列の先頭から各要素が目的の値と等しいかどうを順番に調べます。等しいものが見つかった時点でその位置を返し探索を終了します。末尾まで調べて目的の値が存在しなかった場合はそのことを示す特別な値（たとえば-1）を返します。アルゴリズムの効率は悪いですが、線形探索はデータの並びに関係なく適用することができます。
例題 n個の整数を含む数列（配列）Sと、q個の異なる整数を含む数列（配列）Tを読み込み、Tに含まれる整数の中でSに含まれるものの個数Cを出力するプログラムを作成しなさい。
入力
１行目にn、2行目にSを表すn個の整数（空白区切り）、3行目にq、4行目にＴを表すq個の整数が与えられます。
出力
Cを1行に出力してください。
フローチャート %%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%% flowchart TD A(&#34;search(S, n, key)&#34;) --&gt; B[i = 0] --&gt; C{i &lt; n} -- Yes --&gt; D{&#34;S[i] == key&#34;} -- Yes --&gt; E(return True) D -- No --&gt; F[i += 1] --&gt; C C -- No ---&gt; G(return False) %%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%% flowchart TD A(開始) --&gt; B[/nを読み込む/] --&gt; C[i = 0] --&gt; D{i &lt; n} -- Yes --&gt; E[&#34;</description>
      <content>&lt;script src=&#34;https://unpkg.com/mermaid/dist/mermaid.min.js&#34;&gt;&lt;/script&gt;
&lt;h1 id=&#34;アルゴリズム入門探索&#34;&gt;アルゴリズム入門（探索）&lt;/h1&gt;
&lt;p&gt;レッスン104で学んだようにある課題に対してそれを解決するための処理手順のことを「アルゴリズム」といいます。&lt;/p&gt;
&lt;p&gt;今回は探索のアルゴリズムをフローチャートを使って学び、フローチャートに基づいてプログラムを作成してみましょう。&lt;/p&gt;
&lt;p&gt;探索あるいは検索とは、データの集合の中から目的の要素を探し出す処理です。&lt;/p&gt;
&lt;h2 id=&#34;線形探索&#34;&gt;線形探索&lt;/h2&gt;
&lt;p&gt;線形探索は、配列の先頭から各要素が目的の値と等しいかどうを順番に調べます。等しいものが見つかった時点でその位置を返し探索を終了します。末尾まで調べて目的の値が存在しなかった場合はそのことを示す特別な値（たとえば-1）を返します。アルゴリズムの効率は悪いですが、線形探索はデータの並びに関係なく適用することができます。&lt;/p&gt;
&lt;h3 id=&#34;例題&#34;&gt;例題&lt;/h3&gt;
&lt;p&gt;n個の整数を含む数列（配列）Sと、q個の異なる整数を含む数列（配列）Tを読み込み、Tに含まれる整数の中でSに含まれるものの個数Cを出力するプログラムを作成しなさい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入力&lt;/p&gt;
&lt;p&gt;１行目にn、2行目にSを表すn個の整数（空白区切り）、3行目にq、4行目にＴを表すq個の整数が与えられます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出力&lt;/p&gt;
&lt;p&gt;Cを1行に出力してください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;フローチャート&#34;&gt;フローチャート&lt;/h3&gt;
&lt;div class=&#34;mermaid&#34;&gt;
%%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%%
flowchart TD
    A(&#34;search(S, n, key)&#34;) --&gt; B[i = 0] --&gt;
    C{i &lt; n} -- Yes --&gt; D{&#34;S[i] == key&#34;} -- Yes --&gt; E(return True)
    D -- No --&gt; F[i += 1] --&gt; C
    C -- No ---&gt; G(return False)
&lt;/div&gt;
&lt;div class=&#34;mermaid&#34;&gt;
%%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%%
flowchart TD
    A(開始) --&gt; B[/nを読み込む/] --&gt; C[i = 0] --&gt; D{i &lt; n} -- Yes --&gt;
    E[&#34;S[i]を読み込む&#34;] --&gt; F[i += 1] --&gt; D
    D --- No ---&gt; G[/qを読み込む/] --&gt; H[Sum = 0] --&gt; I[i = 0] --&gt;
    J{i &lt; q} -- Yes --&gt; K[&#34;keyを読み込む&#34;] --&gt; L[[&#34;search(S, n, key)&#34;]] --&gt;
    M{結果がTrue} -- Yes --&gt; N[Sum += 1] --&gt; O[i += 1] --&gt; J
    M -- No --&gt; O
    J -- No -----&gt; P[/Sumを書き出す/] --&gt; Q(終了)
&lt;/div&gt;
&lt;h3 id=&#34;プログラムを作ってみよう課題&#34;&gt;プログラムを作ってみよう（課題）&lt;/h3&gt;
&lt;p&gt;上記フローチャートからPythonでプログラムを作ってみましょう。完成したら以下のテストデータを入力し、正しく出力されるか確かめてみましょう。&lt;/p&gt;
&lt;p&gt;入力例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;5
1 2 3 4 5
3
3 4 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;出力例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;ヒント&#34;&gt;ヒント&lt;/h3&gt;
&lt;p&gt;Pythonでデータを入力するには&lt;code&gt;input()&lt;/code&gt;という関数を使用します。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;input()&lt;/code&gt;では1行分のデータが文字列として取得されます。&lt;/p&gt;
&lt;p&gt;従って&lt;code&gt;n&lt;/code&gt;や&lt;code&gt;q&lt;/code&gt;のような1個の数値を取得する際は&lt;code&gt;int()&lt;/code&gt;という関数で文字列を数値に変換し、&lt;code&gt;n = int(input())&lt;/code&gt;のようにして取得します。&lt;/p&gt;
&lt;p&gt;スペース（空白）で区切られたSのような数列（配列）を取得する際は、&lt;code&gt;split(&amp;quot; &amp;quot;)&lt;/code&gt;という関数を使用して、&lt;code&gt;&amp;quot; &amp;quot;&lt;/code&gt;（スペース（空白））で文字列を分割し、文字列の配列として取得します。（&lt;code&gt;ary = input().split(&amp;quot; &amp;quot;)&lt;/code&gt;のようにaryという文字列配列を取得します）&lt;/p&gt;
&lt;p&gt;その後配列の各要素を&lt;code&gt;int()&lt;/code&gt;関数で数値に変換します。&lt;/p&gt;
&lt;p&gt;変換した値を数値の配列Sに入れる際には&lt;code&gt;S = []&lt;/code&gt;のように空の配列に初期化し、後から&lt;code&gt;s.append()&lt;/code&gt;という関数で値を追加していきます。&lt;/p&gt;
&lt;p&gt;関数は&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;関数名&lt;/span&gt;(引数):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	処理内容
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; 戻り値
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように書きます。この関数を呼ぶには&lt;code&gt;関数名（引数）&lt;/code&gt;のように書きます。&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;回答例&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;search&lt;/span&gt;(S, n, key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; S[i]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(input())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;S &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ary &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    S&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(int(ary[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(input())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ary &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(q):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(ary[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; search(S, n, key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Sum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(Sum)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id=&#34;二分探索&#34;&gt;二分探索&lt;/h2&gt;
&lt;p&gt;数列（配列）が昇順（または降順）にソートされて並んでいる場合、二分探索というアルゴリズムを使用してより高速な探索を行うことができます。&lt;/p&gt;
&lt;p&gt;アルゴリズムは以下の通りです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;数列（配列）全体を探索の範囲とします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;探索の範囲内の中央の要素を調べます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目的の値と中央の要素の値が一致すれば、探索を終了します。（探索成功）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;目的の値が中央の要素の値よりも小さければ、探索範囲の前半部分を、大きければ探索範囲の後半部分を新たな探索範囲として2.の処理に戻ります。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;その際、探索範囲がなくなれば（探索の右端と左端が一致すれば）、探索を終了します。（探索失敗）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体的な例を見てみましょう。次の図は、昇順に整列された14個の要素を含む数列（配列）Sから、二分検索により&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;を探す様子です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  0   1   2   3   4   5   6   7   8   9  10  11  12  13  14
[ 1   3   6   7  10  11  15  23  36  51  64  86 103 121 ]
left                          ↑ mid                     right
1回目                         36
                               [ 36  51  64  86 103 121 ]
　　　　　　　　　　　　　　　　　　　left 　　　　　 ↑ mid     right
2回目　　　　　　　　　　　　　　　　　　　　　　　　 36
                               [ 36  51  64 ]
                               left   ↑ mid right
3回目　　　　　　　　　　　　　　　　　　　 36
                               [ 36 ]
                             left ↑ mid right
4回目                             36   
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;まず二分検索はデータ全体を探索範囲とするので、&lt;code&gt;left&lt;/code&gt;は&lt;code&gt;0&lt;/code&gt;に、&lt;code&gt;right&lt;/code&gt;は要素数の&lt;code&gt;n(=14)&lt;/code&gt;に初期化し、探索範囲を&lt;code&gt;0&lt;/code&gt;以上&lt;code&gt;n&lt;/code&gt;未満にします。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;次に、現時点の探索範囲の中央の位置&lt;code&gt;mid&lt;/code&gt;を&lt;code&gt;(left + right) / 2&lt;/code&gt;（整数に丸める）で求めます。&lt;code&gt; mid = (0 + 14) / 2 = 7&lt;/code&gt;になります。（1回目）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;は中央の要素&lt;code&gt;S[7]&lt;/code&gt;の値&lt;code&gt;23&lt;/code&gt;より大きいので、次の探索範囲を現在の探索範囲の後半部分にします。すなわち、探索範囲の左端（&lt;code&gt;left&lt;/code&gt;）の値を中央の位置(&lt;code&gt;mid&lt;/code&gt;) &lt;code&gt;+ 1&lt;/code&gt;の&lt;code&gt;8&lt;/code&gt;にして、探索範囲を&lt;code&gt;8&lt;/code&gt;以上&lt;code&gt;n&lt;/code&gt;未満にします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;次に、新しい探索範囲の中央の位置&lt;code&gt;mid&lt;/code&gt;を&lt;code&gt;(left + right) / 2&lt;/code&gt;（整数に丸める）で求めます。 &lt;code&gt;mid = (8 + 14) / 2 = 11&lt;/code&gt;になります。（2回目）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;は中央の要素&lt;code&gt;S[11]&lt;/code&gt;の値&lt;code&gt;86&lt;/code&gt;より小さいので、次の探索範囲を現在の探索範囲の前半部分にします。すなわち、探索範囲の右端（&lt;code&gt;right&lt;/code&gt;）の値を中央の位置(&lt;code&gt;mid&lt;/code&gt;) の&lt;code&gt;11&lt;/code&gt;にして、探索範囲を&lt;code&gt;8&lt;/code&gt;以上&lt;code&gt;11&lt;/code&gt;未満にします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;次に、現時点の探索範囲の中央の位置&lt;code&gt;mid&lt;/code&gt;を&lt;code&gt;(left + right) / 2&lt;/code&gt;（整数に丸める）で求めます。 &lt;code&gt;mid = (8 + 11) / 2 = 9&lt;/code&gt;になります。（3回目）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;は中央の要素&lt;code&gt;S[9]&lt;/code&gt;の値&lt;code&gt;51&lt;/code&gt;より小さいので、次の探索範囲を現在の探索範囲の前半部分にします。すなわち、探索範囲の右端（&lt;code&gt;right&lt;/code&gt;）の値を中央の位置(&lt;code&gt;mid&lt;/code&gt;) の&lt;code&gt;9&lt;/code&gt;にして、探索範囲を&lt;code&gt;8&lt;/code&gt;以上&lt;code&gt;9&lt;/code&gt;未満にします。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;次に、現時点の探索範囲の中央の位置&lt;code&gt;mid&lt;/code&gt;を&lt;code&gt;(left + right) / 2&lt;/code&gt;（整数に丸める）で求めます。 &lt;code&gt;mid = (8 + 9) / 2 = 8&lt;/code&gt;になります。（4回目）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;は中央の要素&lt;code&gt;S[8]&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;と等しいので探索を終了し、見つかったので&lt;code&gt;True&lt;/code&gt;を返します。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;なお、例えば&lt;code&gt;key&lt;/code&gt;の値を&lt;code&gt;37&lt;/code&gt;とすると、３回目までは上記と同様の処理になりますが、4回目の処理では&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;37&lt;/code&gt;は中央の要素&lt;code&gt;S[8]&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;より大きいので、索範囲の左端（&lt;code&gt;left&lt;/code&gt;）の値を中央の位置(&lt;code&gt;mid&lt;/code&gt;) &lt;code&gt;+ 1&lt;/code&gt;の&lt;code&gt;9&lt;/code&gt;にします。この値は探索範囲の右端（&lt;code&gt;right&lt;/code&gt;）の値&lt;code&gt;9&lt;/code&gt;と等しくなり、右端と左端が一致して探索範囲がなくなったので、探索を終了し、見つからない&lt;code&gt;False&lt;/code&gt;を返します。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同様に、例えば&lt;code&gt;key&lt;/code&gt;の値を&lt;code&gt;35&lt;/code&gt;とすると、３回目までは上記と同様の処理になりますが、4回目の処理では&lt;code&gt;key&lt;/code&gt;の値&lt;code&gt;35&lt;/code&gt;は中央の要素&lt;code&gt;S[8]&lt;/code&gt;の値&lt;code&gt;36&lt;/code&gt;より小さいので、索範囲の右端（&lt;code&gt;right&lt;/code&gt;）の値を中央の位置(&lt;code&gt;mid&lt;/code&gt;) の&lt;code&gt;8&lt;/code&gt;にします。この値は探索範囲の右端（&lt;code&gt;left&lt;/code&gt;）の値&lt;code&gt;8&lt;/code&gt;と等しくなり、右端と左端が一致して探索範囲がなくなったので、探索を終了し、見つからない&lt;code&gt;False&lt;/code&gt;を返します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;処理速度については、例えばデータの数が100個の場合、線形探索では、最初の値が探索する値なら1回の探索で済みますが、最後尾まで見つからなければ最悪100回の探索が必要になります。一方、二分検索では、最悪でも8回探索すれば数値が見つかるあるいは見つからないことがわかります。&lt;/p&gt;
&lt;h3 id=&#34;例題-1&#34;&gt;例題&lt;/h3&gt;
&lt;p&gt;n個の整数を含む数列（配列）Sと、q個の異なる整数を含む数列（配列）Tを読み込み、Tに含まれる整数の中でSに含まれるものの個数Cを出力するプログラムを作成しなさい。ただし、数列（配列）Sは昇順にソートされているものとします。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;入力&lt;/p&gt;
&lt;p&gt;１行目にn、2行目にSを表すn個の整数（空白区切り）、3行目にq、4行目にＴを表すq個の整数が与えられます。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出力&lt;/p&gt;
&lt;p&gt;Cを1行に出力してください。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;フローチャート-1&#34;&gt;フローチャート&lt;/h3&gt;
&lt;div class=&#34;mermaid&#34;&gt;
%%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%%
flowchart TD
    A(&#34;binarySearch(S, n, key)&#34;) --&gt; B[left = 0] --&gt; C[right = n] --&gt;
    D{left &lt; right} -- Yes --&gt; E[&#34;mid = (left + right) / 2&#34;] --&gt;
    F{&#34;key == S[mid]&#34;} -- Yes ----&gt; G(return True)
    F -- No --&gt; H{&#34;key &gt; S[mid]&#34;} -- Yes --&gt; I[left = mid + 1] --&gt; D
    H -- No --&gt; J[right = mid] --&gt; D
    D -- No ------&gt; K(return False)
&lt;/div&gt;
&lt;div class=&#34;mermaid&#34;&gt;
%%{init:{&#39;themeVariables&#39;:{&#39;lineColor&#39;:&#39;#FFFFFFFF&#39;}}}%%
flowchart TD
    A(開始) --&gt; B[/nを読み込む/] --&gt; C[i = 0] --&gt; D{i &lt; n} -- Yes --&gt;
    E[&#34;S[i]を読み込む&#34;] --&gt; F[i += 1] --&gt; D
    D --- No ---&gt; G[/qを読み込む/] --&gt; H[Sum = 0] --&gt; I[i = 0] --&gt;
    J{i &lt; q} -- Yes --&gt; K[&#34;keyを読み込む&#34;] --&gt; L[[&#34;binarySearch(S, n, key)&#34;]] --&gt;
    M{結果がTrue} -- Yes --&gt; N[Sum += 1] --&gt; O[i += 1] --&gt; J
    M -- No --&gt; O
    J -- No -----&gt; P[/Sumを書き出す/] --&gt; Q(終了)
&lt;/div&gt;
&lt;h3 id=&#34;プログラムを作ってみよう課題-1&#34;&gt;プログラムを作ってみよう（課題）&lt;/h3&gt;
&lt;p&gt;上記フローチャートからPythonでプログラムを作ってみましょう。完成したら以下のテストデータを入力し、正しく出力されるか確かめてみましょう。&lt;/p&gt;
&lt;p&gt;入力例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;5
1 2 3 4 5
3
3 4 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;出力例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;ヒント-1&#34;&gt;ヒント&lt;/h3&gt;
&lt;p&gt;データの入力の方法は線形探索のときと同様です。&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;回答例&lt;/summary&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;binarySearch&lt;/span&gt;(S, n, key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    left &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    right &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;while&lt;/span&gt; left &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; right:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        mid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (left &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; right) &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; S[mid]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; S[mid]:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            left &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mid &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            right &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; mid
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(input())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;S &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ary &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(n):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    S&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(int(ary[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Sum &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(input())
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ary &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; input()&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34; &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(q):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(ary[i])
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; binarySearch(S, n, key):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Sum &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(Sum)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;script&gt;
    mermaid.initialize({
      startOnLoad: true
    });
&lt;/script&gt;
</content>
    </item>
    
  </channel>
</rss>
