🍣

AtCoder Beginner Contest 349 B - Commencement 覚書き

2024/04/14に公開

PHPで解答を作成しています。

問題のリンク
https://atcoder.jp/contests/abc349/tasks/abc349_b

解法に関しては以下のリンクを参考にしました。ありがとうございます。
https://qiita.com/wihan23/items/2b4402169469019be2e2

解のポイント

array_count_valuesの利用
配列の操作と処理

考察

例えば標準入力が以下の時

commencement

各文字の出現回数を数える配列$countは以下の通りとなる

//配列$count
Array
(
    [c] => 2
    [o] => 1
    [m] => 3
    [e] => 3
    [n] => 2
    [t] => 1
)

ある出現回数に対して何種類の文字が存在するかをカウントし配列にする。

$total_count = array_count_values($count);

配列を出力すると以下の通りである。

//配列$total_count
Array
(
    [2] => 2
    [1] => 2
    [3] => 2
)

上から順に
出現回数2回:2種類
出現回数1回:2種類
出現回数3回:2種類

つまり全部2種類なので条件を満たしている=良い文字列=Yesを出力なのですが…
手作業でする訳にはいかないので、チェックしていく文を作ります。

foreach($total_count as $fleq => $char_count)

これは$countの配列を
各文字(fleq)とその出現回数(char_count)新しく設定した変数にマッピングして反復処理を行う。

参考
https://www.php.net/manual/ja/control-structures.foreach.php

foreach($total_count as $fleq => $char_count){
  if($char_count !== 2 && $char_count !== 0){
    echo "No\n";
    return;
  }
}

echo "Yes\n";

&&は演算子の両側が true の場合に限り、結果が true となる。
if($char_count !== 2 && $char_count !== 0)という条件で
出現回数($char_count)が2でもなく0でもないときにtrueとなり次の処理が行われる。

echo "No\n";

次の一文でこのプログラムの全処理が終了する。

return;

もしtrueではない、つまり、$char_countに2か0があった場合は最後に以下の処理が行われる。

echo "Yes\n";

使用する関数/論理演算子

&&
&&: 演算子の両側が true の場合に限り、結果が true となる。
今回は、文字の出現数に対して「0でもなく2でもない」条件をつける時に使用している。

str_split
文字列を配列に変換する。

array_count_values
array のキーとその登場回数を組み合わせた連想配列を返します。

例1 array_count_values() の例

<?php
$array = array(1, "hello", 1, "world", "hello");
print_r(array_count_values($array));
?>

上の例の出力は以下となります。

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)

array_count_valuesを使うことで
元々の配列のvalueが(値)キーとなる。
カウントした回数はvalue(値)になる。

全体コード

<?php

// 標準入力から文字列 S を受け取る
$s = trim(fgets(STDIN));

// 各文字の出現回数を数える
$count = array_count_values(str_split($s));

// print_r($count);

// 出現回数ごとの文字種類数を記録する配列
$total_count = [];

// 各出現回数に対して何種類の文字が存在するかを計算
$total_count = array_count_values($count);

// print_r($total_count);

foreach($total_count as $fleq => $char_count){
  if($char_count !== 2 && $char_count !== 0){
    echo "No\n";
    return;
  }
}

echo "Yes\n";

参考情報

https://www.php.net/manual/ja/function.array-count-values

Discussion