Official
A - アルファベット分類 / Alphabet Classification Editorial by admin
GPT 5.4 High概要
各文字列について「先頭の文字」だけを見て、a から z の 26 種類のどのグループに入るかを数えます。
最後に、その中で最も個数が多いグループの大きさを出力すればよい問題です。
考察
この問題では、文字列全体の内容は必要ありません。グループ分けの条件は 先頭の文字が同じかどうか だけだからです。
たとえば、文字列が
appleantbananabookcat
なら、
aで始まるもの: 2 個bで始まるもの: 2 個cで始まるもの: 1 個
となり、答えは \(2\) です。
重要な観察
- グループは先頭文字ごとに決まる
- 先頭文字は英小文字なので、ありえるグループは
a~zの 26 個だけ - 同じ文字列が複数回現れても、問題文にある通り 別々に数える ので、単純に出現回数を数えればよい
素朴な方法
各文字列を先頭文字ごとに分類して、リストに入れていくこともできます。
しかし、この問題で欲しいのは「最大の個数」だけなので、実際に文字列を保存する必要はありません。
どう解決するか
a~z の 26 個のカウンタを用意し、各文字列について
- 先頭文字を取り出す
- その文字に対応するカウンタを 1 増やす
とすれば十分です。
最後に 26 個のカウンタの最大値を出力すれば答えになります。
アルゴリズム
長さ 26 の配列
cntを 0 で初期化するcnt[0]はaで始まる文字列の個数cnt[1]はbで始まる文字列の個数- …
cnt[25]はzで始まる文字列の個数
各文字列
sについて、先頭文字s[0]を見るord(s[0]) - ord('a')によってaを 0,bを 1, …,zを 25 に変換し、対応するcntを 1 増やす最後に
max(cnt)を出力する
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)
cnt の大きさは常に 26 で固定なので、追加で使うメモリは定数です。
実装のポイント
- 文字列は長さ 1 以上なので、
s[0]を安全に使えます - 改行を除くために
input().strip()を使っています - 先頭文字から配列の添字を求めるために
ord()を使っています
たとえば 'c' の場合は
ord('c') = 99ord('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: