C言語学習ポータル(無料版) 学習コンテンツ プログラミング的思考 日常の問題をアルゴリズム化する

🧭 プログラミング的思考

日常の問題をアルゴリズム化する

無料公開版に収録・読む目安 12分

🎯 身近な問題を、抜けのない手順として書き下せるようになる

道具は4つ揃いました。分解・パターン・抽象化・アルゴリズムです。ここでは実際に、日常の問題を機械が実行できる手順に落としてみます。これができれば、あとは文法を覚えるだけという段階に入ります。

例題1: 自動販売機のおつり

1000円を入れて150円の飲み物を買ったとき、850円のおつりを枚数が最も少なくなるように返す手順を考えます。

  1. おつり ← 投入金額 − 商品の値段
  2. 大きい硬貨から順に(500円、100円、50円、10円)次を繰り返す
  3. その硬貨でおつりを割った商の枚数だけ、その硬貨を出す
  4. おつり ← おつりを、その硬貨で割った余り
  5. おつりが0になったら終了

850円なら、500円が1枚(残り350)、100円が3枚(残り50)、50円が1枚(残り0)。合計5枚です。大きいものから順に取れるだけ取るというこの考え方には、貪欲法という名前が付いています。

ビット名前がついてるってことは、みんなが何度も使ってきた型ってことだよ。

例題2: じゃんけんの勝敗

自分と相手の手を受け取り、勝敗を返します。素直に書くと、組み合わせを9通り全部書くことになります。でもパターンを探すと、こう縮みます。

  1. 2つの手が同じなら「あいこ」
  2. 自分がグーで相手がチョキ、自分がチョキで相手がパー、自分がパーで相手がグー、のいずれかなら「勝ち」
  3. それ以外は「負け」

9通りが3通りになりました。先に例外(あいこ)を片づけると、残りが単純になる——これは実務でもよく効く型です。

例題3: 朝の準備を最短にする

ここには新しい観点が入ります。同時にできるかです。

順にやれば12分ですが、「お湯を沸かす」と「パンを焼く」を先に始めて、待つ間に顔を洗えば5分で済みます。プログラムの世界でも、待ち時間の間に別の仕事をする考え方があります(並行処理)。今は「順番の付け方で、かかる時間が変わる」ことだけ知っておいてください。

書けたら、必ず変な入力で試す

手順ができたら、意地の悪い入力を自分で当ててみてください。おつりの例なら「ちょうどの金額を入れた(おつり0円)」「1円足りない」「両替できる硬貨が切れている」。じゃんけんなら「グーとしか書かれていない入力」。普通の入力で動くのは当たり前で、変な入力で壊れないかが品質です。この習慣は、のちのセキュリティの話にまっすぐつながります。

共通する進め方

どの例題でも、やったことは同じです。

  1. 入力と出力をはっきりさせる(何をもらって、何を返すか)
  2. 大きい流れを分解する
  3. 繰り返せる部分・共通部分を見つける
  4. 例外(0円のとき、あいこ、在庫切れ)を洗い出す
  5. 擬似コードに落とす

この順番は、これから何度も使います。困ったら1に戻ってください。

要点まとめ

アプリで演習問題まで解く(無料・登録不要)

この項目に出てくる用語

アルゴリズムあるごりずむ

問題を解くための手順を、誰が読んでも同じ結果になるように整理したもの。料理のレシピのように、順序立った具体的な手続きのことを指す。同じ問題でも、良いアルゴリズムを選ぶことで処理速度が大きく変わることがある。

擬似コードぎじこーど

プログラミング言語の文法にとらわれず、日本語や簡単な記号で手順の流れを書き表したもの。実装に入る前に頭の中を整理するための下書きにあたる。「もし〜ならば」「〜を繰り返す」のように、日本語まじりで書いてかまわない。

同じトラックのほかの項目

問題を分解する(Decomposition)大きな問題を、手が動く大きさの小問題に分ける考え方を身につける パターンを見つける(Pattern Recognition)分解した作業の中から共通点・繰り返しを見つけ出せるようになる 抽象化——捨てる勇気目的に必要な情報だけを残し、残りを捨てる「抽象化」の考え方を理解する アルゴリズム——手順を組み立てるアルゴリズムの条件を理解し、順次・分岐・反復の3つの型で手順を組み立てられる 擬似コードで書いてみる擬似コードの書き方を知り、日本語まじりで手順を表現できるようになる フローチャート入門フローチャートの基本記号を覚え、処理の流れを図で読み書きできる 良い手順・悪い手順——効率の予感同じ結果でも手順によって手数が大きく変わることを、探索の例で実感する
‹ フローチャート入門 良い手順・悪い手順——効率の予感 ›

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版(BOOTH)を見る

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版 / BOOTH