問題
プログラムは 1 行ごとに 1 つのイベントを書いたログファイルを出力します。各行はレベルを表す単語から始まり、その後にスペースとメッセージが続きます。たとえば ERROR disk full のようになります。
ログファイルの行が与えられるので、最初の単語がちょうど INFO、WARNING、ERROR のいずれかである行を数えてください。小文字のレベルを含め、それ以外で始まる行は無視します。
count_log_levels(lines) を実装してください。
Input
lines: 改行を含まない、ファイルの各行。
Output
[info_count, warning_count, error_count] を返してください。
制約
0 ≤ 行数 ≤ 10,000
各行は 200 文字以下
例
入力:
lines = ["INFO server started", "ERROR disk full", "INFO user login", "WARNING slow query"]
期待される出力:
expected = [2, 1, 1]
入力:
std::vector<std::string> lines = {"INFO server started", "ERROR disk full", "INFO user login", "WARNING slow query"};
期待される出力:
std::vector<long long> expected = {2, 1, 1};
入力:
string[] lines = new string[] {"INFO server started", "ERROR disk full", "INFO user login", "WARNING slow query"};
期待される出力:
long[] expected = new long[] {2, 1, 1};
解説
INFO で始まる行が 2 行、WARNING が 1 行、ERROR が 1 行: [2, 1, 1]。
入力:
lines = ["info lowercase", "DEBUG details", "ERROR"]
期待される出力:
expected = [0, 0, 1]
入力:
std::vector<std::string> lines = {"info lowercase", "DEBUG details", "ERROR"};
期待される出力:
std::vector<long long> expected = {0, 0, 1};
入力:
string[] lines = new string[] {"info lowercase", "DEBUG details", "ERROR"};
期待される出力:
long[] expected = new long[] {0, 0, 1};
解説
"info" は "INFO" ではなく、DEBUG は数えません。最後の行は ERROR という単語だけで、これは数えます: [0, 0, 1]。
解き方のヒント
まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。
ヒント 1
各行で大事なのは最初の単語だけです。
ヒント 2
最初の空白で 1 回だけ分割し、その単語を完全一致で比べます。
ヒント 3
大文字と小文字は区別します。"info" は "INFO" ではなく、レベルの単語だけの行もあります。
目安の計算量
時間 O(合計の長さ)、追加メモリ O(1)
参考資料
この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。