【データセット選択メニュー】> 【集合の結合】STEP: 3 重複の判定 1 (paizaランク C 相当) [難易度: 1495 ±17]
※リンク先へ移動するためには[paiza]へのログインが必要です。
N 個の要素からなる数列 A が与えられます。2 ≦ i ≦ N の各 i に対して、A_i と同じ値が A_1 から A_{i-1} の間にあるかどうかを判定してください。
入力値(例)
9
1 2 3 2 5 3 3 10 2
出力値(例)
No
No
Yes
No
Yes
Yes
No
Yes
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php $n = trim(fgets(STDIN)); $array = explode(" ", trim(fgets(STDIN))); for($i = 1; $i < $n; $i++) { $s = array_slice($array, 0, $i); $tail = $array[$i]; if(in_array($tail, $s)) { echo "Yes". "\n"; } else { echo "No". "\n"; } } ?> |
解説
問題を読み解くのに少し苦労しました。
入力値(例)の例でみると、
9
1 2 3 2 5 3 3 10 2
まず、「1」と「2」が重複しているかを調べます。→ No
次に、「1」と「2」と「3」→ No
次は、「1」「2」「3」「2」で 最後の2は重複しているので → Yes
次は、「1」「2」「3」「2」「5」で 最後の5は重複していないので → No
次の「1」「2」「3」「2」「5」「3」で 最後の3が重複しているので → Yes...
と最後の数値が重複しているかを調べていきます。
for()文でループしながら、
1 |
$s = array_slice($array, 0, $i); |
配列をスライスで切り取りつつ、最後の数値を$tailに入れて in_array()で特定の値が含まれているか調べます。
in_array()は第1引数が探したい値、第2引数が配列で、TRUEかFALSEを返します。