単語の 出現回数を 多い順に出す
- 文字列の処理
- 問題 02
- やさしい
- 目安 11 分
空白で
本番の
入力は
問題
英小文字だけの
入力の形式
w_1 w_2 ... w_N1 行に N 個の
出力の形式
出てきた
制約
- 単語の
数 N は、 1 以上 100000 以下です - どの
単語も、 英小文字 (a から z) だけの 1 文字以上 10 文字以下です
入力と出力の例
例 1
the が
入力
the cat and the dog and the bird
出力
the 3 and 2 bird 1 cat 1 dog 1
例 2
単語が
入力
go
出力
go 1
例 3
回数が
入力
b a b a c
出力
a 2 b 2 c 1
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
全部の
先に
解答
単語を
Python
Python
words = input().split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1
for word, count in sorted(counts.items(), key=lambda pair: (-pair[1], pair[0])):
print(word, count)JavaScript
JavaScript
const lines = require("fs").readFileSync(0, "utf8").split("\n");
const words = lines[0].split(" ");
const counts = new Map();
for (const word of words) {
counts.set(word, (counts.get(word) ?? 0) + 1);
}
const pairs = [...counts.entries()];
pairs.sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0));
console.log(pairs.map(([word, count]) => `${word} ${count}`).join("\n"));計算量
時間は O(N + K log K) です。words.count(word) を
よく ある間違い
- 回数が
同じ ときの 並びを 決めずに、 数えた 順のまま 出してしまう。 出力は 辞書順と 決まっています - JavaScript の sort に
比べる 関数を 渡さず、 回数を 文字として 比べてしまう。 10 が 9 より 前に来ます - JavaScript の
localeCompareで辞書順を 比べて、 環境に よって 並びが 変わる。 英小文字だけなら <で比べれば十分です - 入力の
行の 後ろに 付く 改行を 取り除かず、 最後の 単語に 改行が 付いたまま 数えてしまう。 split()を引数なしで 呼ぶ Python は 安全で、 JavaScript は lines[0]を使えば 改行は 入りません
解答を動かした版 Python 3.12.14Node.js 22.23.4確認日 2026/10/31