ページ

2012/07/04

[競技プログラミング][PHP][AtCoder]大好き高橋君 ( Love me do )

A - 大好き高橋君 ( Love me do )

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

 高橋君は自分が大好きなので、自分の評判を調べるために自分の名前が入っているツイートを調べたいと考えました。
しかし彼のフォロー数は多いので、タイムラインを 1 つずつ確認して自分に関係あるつぶやきを探すのは面倒です。

 そこで高橋くんを手伝うために、与えられる文から高橋君を表す単語が現れる回数を数えてください。
 ただし、単語の一部に高橋君を表す単語を含んでいた場合も、
高橋君を表す単語と完全に一致しない限り、その単語を高橋君を表す単語として数えないでください。

 以下の3単語が高橋君を表す単語です。
TAKAHASHIKUN(高橋君をヘボン式ローマ字にして、全て大文字にしたもの)
Takahashikun(高橋君をヘボン式ローマ字にして、先頭の 1 文字のみ大文字、残りは小文字にしたもの)
takahashikun(高橋君をヘボン式ローマ字にして、全て小文字にしたもの)

入力

入力は以下の形式で標準入力から与えられる。
N
w0 w1 … wN−1.
入力は 2 行ある。
1 行目には、2 行目に与えられる文に含まれる単語数を表す整数 N(1≦N≦50) が与えられる。
2 行目には 2 文字以上 100 文字以下の 1 文が与えられる。
文は単語 wi(0≦i≦N−1)から成り、各単語は空白で区切られている。
最後の単語 wN−1 の後には空白を挟まず . がある。
単語 wi(0≦i≦N−1) は英字(A-Z, a-z)で成り立っている。

出力

与えられた文の中で高橋君を表す単語が現れる回数を標準出力に 1 行で出力せよ。
なお、最後には改行を出力せよ。

出典

A: 大好き高橋君 ( Love me do ) - AtCoder Regular Contest #005 | AtCoder

回答

AtCoder/arc005_1.php at master · wada811/AtCoder · GitHub

<?php
fscanf(STDIN, "%d", $n);
$sentence = fgets(STDIN);
$words = explode(' ', str_replace(".", "", $sentence));
$count = 0;
foreach($words as $word){
    $count += preg_match('/^(TAKAHASHIKUN|Takahashikun|takahashikun)$/', $word, $match);
}
echo $count . PHP_EOL;
?>
PHPで標準入力から一行取得するには3行目のようにする。
4行目でピリオドを消し飛ばして半角スペースで分割する。
単語ごとにマッチするかチェックしつつpreg_matchでマッチした回数をカウントする。
後は出力するだけ。
本当はpreg_match_allでやりたかったけど正規表現パワーが足りなかった…。