1. test 1
  2. test 2
  3. test 3
  4. test 4
  5. test 5
  6. test 6
  7. test 7
コース一覧
アルゴリズム道場 カメ師範の十の巻
第八の巻 キューを作れ

アルゴリズム道場 カメ師範の十の巻

言語を問わず、考え方だけを問う演習専用コースです。解説はありません。巻物と完成条件だけを読み、白紙から自分で組み立てます。Python・JavaScript・TypeScript・Java のどれで解いても構いません。手が止まったときのために、方針・使う構文・部分解の3段階のヒントを各問に用意しています。総和と最大から始まり、線形探索、整列、二分探索、再帰、スタックとキューを経て、最後は初見の疑似コードを読み解いて実装するところまで、10問でアルゴリズムの基礎を一巡します。1問15分から45分、全10問で約5時間です。いずれかの言語の入門を終えて「動くものは書けるが、考え方に自信がない」と感じている方に向いています。

1
初段
01. 第一の巻 総和と最大15分
02. 第二の巻 線形探索15分
03. 第三の巻 バブルソート20分
04. 第四の巻 二分探索25分
2
中段
01. 第五の巻 整列の途中経過25分
02. 第六の巻 再帰25分
03. 第七の巻 スタックを作れ30分
04. 第八の巻 キューを作れ30分
3
師範
01. 第九の巻 計算量を体感せよ35分
02. 免許皆伝 初見の巻物45分

第八の巻 キューを作れ

中段 / 目安 30分

カメ師範が、ハレノヒ珈琲の前にできた行列を顎で指しました。

「あそこで、後から来た者が先に珈琲を受け取ったら、どうなる。喧嘩じゃ。世の中の多くの器は、皿のようには積まん。先に並んだ者から先に出す。それが正直な器よ」

八本目の巻物には、こうあります。「ハレノヒ珈琲の行列を見よ。先に並んだ者が先に出る。あの正直な器を作れ。enqueue、dequeue」

この器はキューと呼ばれます。印刷の順番待ちも、メッセージの配達も、世界は行列でできています。

前の巻で作ったスタックと、形は驚くほど似ています。配列を用意し、入れて、出す。違うのはどちら側から出すか、ただ一点です。スタックは入れた側から出しました。キューは反対側から出します。

この一点の違いで、何が変わるのかを手で確かめるのがこの巻の狙いです。前の巻の答えを開いて、変えなければならない行がいくつあるかを数えてみてください。驚くほど少ないはずです。そして、その少ない行が世界を分けています。

完成条件

runQueue という関数を1つ定義してください。どの言語で解いても関数名は runQueue にしてください。Python でも snake_case ではなく、この綴りのまま使います。

引数は1つ、操作を並べたカンマ区切りの文字列です。たとえば次の形です。

プレーンテキスト

enq 3,enq 5,deq,front

操作は3種類です。

  • enq 数 — その数を行列の最後尾に並ばせます
  • deq — 行列の先頭を取り出して器から減らします。空なら何も減らさず empty を記録します
  • front — 先頭を見るだけで器は減らしません。空なら empty を記録します

deq と front は、見た値を出た順に記録していきます。enq は何も記録しません。

全部の操作を終えたら、次の形の1つの文字列を返してください。

プレーンテキスト

queue=5 out=3,5

queue= の後ろは器に残った中身を先頭から最後尾の順にスラッシュでつないだもの、out= の後ろは記録した値をカンマでつないだものです。どちらも空のときは - の一文字にします。上の例は enq 3,enq 5,deq,front を処理した結果です。同じ操作の並びをスタックで処理すると out=5,3 になりました。同じ入力から違う答えが出る、そこがこの巻の見どころです。

引数の文字列の前後には余分な空白が入ることがあります。1つずつ切り出したあとに整えてください。

進め方

白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。

先頭を取り出すたびに、残り全部を1つずつ前へ詰め直すやり方でも答えは合います。ただし行列が長くなると、その詰め直しが重くのしかかります。先頭がどこかを指す番号を1つ持っておけば、詰め直さずに済みます。答えが合ったあとで、自分がどちらを書いたか見直してみてください。師範が第九の巻で問うのは、まさにその差です。

要件

  1. 関数名は4言語すべてで runQueue にすること(Python も snake_case にしない)
  2. 引数はカンマ区切りの操作文字列1つ
  3. 既製のキュー型を使わず、配列だけで組み立てること
  4. enq は数を行列の最後尾に並ばせ、何も記録しないこと
  5. deq は行列の先頭を取り出して器から減らし、その値を記録すること
  6. front は先頭を見るだけで器を減らさず、その値を記録すること
  7. deq と front が空の器に来たら、器を変えず empty を記録すること
  8. 戻り値は「queue=残った中身 out=記録」の形の文字列で、残りは先頭から最後尾へスラッシュ区切り、記録はカンマ区切り
  9. 残りも記録も、空のときは半角ハイフン1文字にすること
  10. 切り出した操作の前後の余分な空白を取り除くこと

入出力例

runQueue("enq 3,enq 5,deq,front") → "queue=5 out=3,5" runQueue("enq 1,enq 2,enq 3") → "queue=1/2/3 out=-" runQueue("deq,front,enq 9,front") → "queue=9 out=empty,empty,9" runQueue("enq 10,deq,deq") → "queue=- out=10,empty" runQueue("enq 4,enq 7,front,deq,deq,front") → "queue=- out=4,4,7,empty" runQueue("enq 42") → "queue=42 out=-" runQueue("enq 8, enq 6 , deq , enq 2") → "queue=6/2 out=8"

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 前の巻のスタックと骨組みは同じです。空の配列を器、空の配列を記録として用意し、操作を1つずつ見ていきます。変える必要があるのは、取り出す側と覗く側をどちらの端にするかだけです。まずスタックの形を書き写し、そこから2か所だけ直す進め方が最短です

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/09

関連レッスン

  • 第九の巻 計算量を体感せよ

    同じ答えを出す2つのやり方で、比べた回数がどれだけ違うかを数えます。

  • 第七の巻 スタックを作れ

    後から入れたものが先に出る器を、配列だけで作ります。

  • 第六の巻 再帰

    自分を呼ぶ関数を書きます。止まる条件を先に決めるのが要です。

  • 第五の巻 整列の途中経過

    選択ソートが3周を終えた時点の並びを答えます。1周で何が確定するかを追います。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • キュー先入れ先出し(FIFO)のデータ構造
  • スタック後入れ先出し(LIFO)のデータ構造
  • 配列サイズ固定の同型データの集まり
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
  • 処理計算や代入を表す長方形
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

第八の巻 キューを作れ

⌘S で保存