Official

A - アルファベット分類 / Alphabet Classification Editorial by admin

GPT 5.4 High

概要

各文字列について「先頭の文字」だけを見て、a から z の 26 種類のどのグループに入るかを数えます。
最後に、その中で最も個数が多いグループの大きさを出力すればよい問題です。

考察

この問題では、文字列全体の内容は必要ありません。グループ分けの条件は 先頭の文字が同じかどうか だけだからです。

たとえば、文字列が

  • apple
  • ant
  • banana
  • book
  • cat

なら、

  • a で始まるもの: 2 個
  • b で始まるもの: 2 個
  • c で始まるもの: 1 個

となり、答えは \(2\) です。

重要な観察

  • グループは先頭文字ごとに決まる
  • 先頭文字は英小文字なので、ありえるグループは az26 個だけ
  • 同じ文字列が複数回現れても、問題文にある通り 別々に数える ので、単純に出現回数を数えればよい

素朴な方法

各文字列を先頭文字ごとに分類して、リストに入れていくこともできます。
しかし、この問題で欲しいのは「最大の個数」だけなので、実際に文字列を保存する必要はありません。

どう解決するか

az の 26 個のカウンタを用意し、各文字列について

  • 先頭文字を取り出す
  • その文字に対応するカウンタを 1 増やす

とすれば十分です。
最後に 26 個のカウンタの最大値を出力すれば答えになります。

アルゴリズム

  1. 長さ 26 の配列 cnt を 0 で初期化する

    • cnt[0]a で始まる文字列の個数
    • cnt[1]b で始まる文字列の個数
    • cnt[25]z で始まる文字列の個数
  2. 各文字列 s について、先頭文字 s[0] を見る

  3. ord(s[0]) - ord('a') によって a を 0, b を 1, …, z を 25 に変換し、対応する cnt を 1 増やす

  4. 最後に max(cnt) を出力する

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(1)\)

cnt の大きさは常に 26 で固定なので、追加で使うメモリは定数です。

実装のポイント

  • 文字列は長さ 1 以上なので、s[0] を安全に使えます
  • 改行を除くために input().strip() を使っています
  • 先頭文字から配列の添字を求めるために ord() を使っています

たとえば 'c' の場合は

  • ord('c') = 99
  • ord('a') = 97

なので、99 - 97 = 2 となり、cnt[2] を増やせばよいです。

ソースコード

import sys

def main():
    input = sys.stdin.readline
    n = int(input())
    cnt = [0] * 26
    for _ in range(n):
        s = input().strip()
        cnt[ord(s[0]) - ord('a')] += 1
    print(max(cnt))

if __name__ == "__main__":
    main()

この解説は gpt-5.4-high によって生成されました。

posted:
last update: