1. [1,2,2,3,3,3] -> 3 (value 3 appears 3 times)
  2. all unique -> 1
  3. all same -> length
  4. single -> 1
  5. two-way tie -> max count
  6. with negatives
コース一覧
コンピューターサイエンス入門:理論編
map で出現回数を数える

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

map で出現回数を数える

エラーコードごとの件数を、変数で並べていられない

ログを読んで、どのエラーが何件出たかを数えたいとします。素直に書くと、こうなります。

Python

timeout = 0 not_found = 0 for line in log: if line == "timeout": timeout += 1 elif line == "not_found": not_found += 1

エラーの種類が 2 つならこれで済みます。ところが本番のログには、見たことのないコードが平気で混ざります。種類が増えるたびに変数と分岐を足すことになり、しかも 知らないコードは数えられません。行が 1 本増えるたびに、コードを書き足しに戻る羽目になります。

数えたい相手が事前に分からない。これが、この形の限界です。

キーごとに、小さなカウンタを持つ

必要なのは「値を渡すと、その値専用のカウンタが出てくる」入れ物です。

Python

counts = {} counts["timeout"] = counts.get("timeout", 0) + 1 counts["timeout"] = counts.get("timeout", 0) + 1 counts["not_found"] = counts.get("not_found", 0) + 1 print(counts) # {'timeout': 2, 'not_found': 1}

変数を先に用意していないのに、timeout のカウンタも not_found のカウンタも勝手に生まれています。初めて見るコードが来ても、その場でカウンタが 1 つ増えるだけです。取り出しも追加も、中に何件入っていても一定の時間で終わります。

無いキーに足そうとすると、落ちる

上の例で counts.get("timeout", 0) と書いたのには理由があります。

Python

counts = {} counts["timeout"] += 1 # KeyError: 'timeout'

+= 1 は「今の値を取り出して、1 を足して、戻す」という意味です。まだ 1 件も入っていないキーには取り出す値が無いので、その時点で止まります。JavaScript の場合は落ちない代わりに undefined + 1 が NaN になり、数えたつもりのものが全部 NaN になります。落ちてくれるぶん、Python のほうが親切です。

get(キー, 0) は「無ければ 0 とみなす」という書き方です。数え上げでは、この 1 手間がほぼ必ず要ります。

数え終わってから探すか、数えながら覚えるか

集計したあとで、いちばん多かった件数を知りたくなることがあります。やり方は 2 通りです。全部数え終わってから表をもう 1 周して探すか、数えている最中に「今までで一番多い件数」も持っておくか。

どちらも O(n) で、出る答えも同じです。違うのは、データを何周するかだけです。

要件

  1. 整数を返す。最大頻度 (もっとも多く出た値の回数)
  2. map / HashMap / dict を使い、1 パスの O(n) で集計する
  3. 空配列のときは 0 を返す

入出力例

frequency([1,2,2,3,3,3]) → 3 frequency([1,2,3,4]) → 1 frequency([5,5,5,5,5]) → 5 frequency([7]) → 1 frequency([1,1,2,2]) → 2 frequency([-1,-1,-1,0,1]) → 3

ヒント

Python なら counts.get(v, 0) + 1 で安全にインクリメント、JS なら (map.get(v) || 0) + 1

ループ内で『現在のカウント』と『これまでの最大』を比較すれば 1 パスで済む

Java は Map.getOrDefault(key, 0) が便利

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

関連レッスン

  • 二数の和 (map で O(n))

    配列の中から和が target となる 2 つの要素のインデックスを map を使って O(n) で見つける。

  • アナグラム判定

    2 つの文字列が同じ文字の並び替えになっているか (アナグラム) を、map による文字数カウントで判定する。

  • 第 4 章クイズ — データ構造 (基本)

    スタック / キュー / set / map の基本性質と計算量を 4 択で総まとめする。

  • バイト → KB 変換

    1024 で割って KB に変換し、容量表示の基本を体得する

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

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

  • 変数データに名前をつけて参照する仕組み
  • カウンタ数を保持して増減する典型 UI
  • JavaScriptWeb で動的な振る舞いを担う言語
  • Map<K,V>キーと値のペアを保持する辞書 + 標準実装
  • 配列サイズ固定の同型データの集まり
main.py
学習モード
エディタを読み込んでいます

メモ

map で出現回数を数える

⌘S で保存