1. 1..6 -> 4,8,12
  2. all even -> doubled
  3. single even
  4. mixed
  5. with zero
  6. with negative even
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
map と filter を組み合わせる

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

map と filter を組み合わせる

条件と変換を 1 本の for に詰め込むと読めない

在庫のある商品だけを取り出して、名前の一覧を作りたいとします。for で書くと、空の入れ物を用意して、条件で弾いて、変換して、詰める、という 4 つの仕事が 1 つのループの中で混ざります。

JavaScript

const names = []; for (const item of items) { if (item.stock > 0) { names.push(item.name); } }

動きはします。ただし後から「条件だけ変えたい」と思ったとき、どの行が条件でどの行が変換なのかを目で探すことになります。行が増えるほど、この仕分けに時間がかかります。

絞ってから変える

道具は 2 つです。filter は条件に合う要素だけを残した新しい配列を返し、map は各要素を変換した新しい配列を返します。

JavaScript

const items = [ { name: "マグカップ", stock: 3 }, { name: "ノート", stock: 0 }, { name: "ペン", stock: 12 }, ]; items.filter(item => item.stock > 0); // [{ name: "マグカップ", stock: 3 }, { name: "ペン", stock: 12 }] items.map(item => item.name); // ["マグカップ", "ノート", "ペン"]

どちらも配列を返すので、そのままつなげられます。「在庫があるものに絞って、名前に変える」と言葉にした順に並べれば、そのままコードになります。

JavaScript

const names = items.filter(item => item.stock > 0).map(item => item.name); // ["マグカップ", "ペン"]

Python では filter と map を入れ子にするより、内包表記で同じ形を書くのが一般的です。Go には両方とも標準では無いので、for を書きます。

解説

覚え方 ... 「絞る」が filter、「変える」が map。日本語で言えた順に並べる。

順番を逆にすると答えが変わる

filter してから map と、map してから filter は別物です。「税込みにしてから 1,000 円以上を残す」と「1,000 円以上を残してから税込みにする」では、税抜き 950 円の商品の行方が変わります。つなぐ前に、絞る条件が変換の前の値に対するものか、後の値に対するものかを確かめてください。

元の配列は書き換わらない

filter も map も新しい配列を返すだけで、渡された配列には触れません。for の中で items[i] = ... と書くやり方だと、呼び出し側が持っている配列まで変わってしまい、離れた場所で原因の分からない不具合になります。空の配列を渡したときも、どちらも空の配列を返すだけで、例外にはなりません。

要件

  1. 偶数の要素だけを残し、それぞれを 2 倍した新しい配列を返す
  2. 元の配列 nums は変更しないこと
  3. 空配列が渡された場合は空配列を返す

入出力例

mapFilter([1,2,3,4,5,6]) → [4,8,12] mapFilter([2,4,6]) → [4,8,12] mapFilter([2,5]) → [4] mapFilter([1,2,3,4]) → [4,8] mapFilter([0,1,2]) → [0,4] mapFilter([-2,-1,0,1,2]) → [-4,0,4]

ヒント

Python ならリスト内包表記 [n * 2 for n in nums if n % 2 == 0] が最短

JS なら nums.filter(...).map(...) のチェーンが定番

filter で残してから map で変換する。順序を逆にすると意味が変わる

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • reduce で積を計算

    配列の全要素を `reduce` (畳み込み) で 1 つの値にまとめる。配列の積を計算する関数を実装し、関数型の畳み込みの概念を理解する。

  • 関数合成

    `compose(f, g)(x) = f(g(x))` の関数合成を関数の中で組み立てて適用する。`addOne` と `double` を合成して値に適用した結果を返す関数を実装する。

  • カリー化

    2 引数の関数を 1 引数の関数のチェーン `f(a)(b)` に変換するカリー化を内部で組み立てて適用する。`add(a, b)` をカリー化して `add(a)(b)` の形で呼び出した結果を返す関数を実装する。

  • trie の単純検索 (prefix マッチ)

    単語の集合に対して `trie` を構築し、与えられたプレフィックスで始まる単語が存在するかを判定する関数を実装する。trie の基本構造とプレフィックスマッチを学ぶ。

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

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

  • ループ繰り返し処理。矢印で戻すか専用記号で示す
  • 配列サイズ固定の同型データの集まり
  • 内包表記for と if を 1 行で書く構文
main.py
学習モード
エディタを読み込んでいます

メモ

map と filter を組み合わせる

⌘S で保存