ポイント1:縦向きの配列に変更する方法
$arrColumn = []; for($i = 0; $i < $sizeN; $i++) { foreach ($arr[$i] as $key => $value) { if (!isset($arrColumn[$key])) { $arrColumn[$key] = []; } $arrColumn[$key][] = $value; } }
if (!isset($arrColumn[$key]))
は、例えば、$arr[0] の配列において、
もし新しい配列$arrColumn[0]に値がなければ、キーが 0 で 値が、$arr[0][$key = 0] の値を代入する。
式で表すと、$arrColumn[0] = $arr[0][$key = 0]
。次に行われる処理は、
$arrColumn[1] = $arr[0][$key = 1]
, $arrColumn[2] = $arr[0][$key = 2]
list($n, $m) = explode(' ', trim(fgets(STDIN))); // $n, $m を 整数に変更 $sizeN = intval($n); $ngLineRain = intval($m); $arr = []; for ($i = 0; $i < $ngLineRain; $i++) { $arr[$i] = explode(' ', trim(fgets(STDIN))); } // 同じキーごとに配列化し直す。つまり、縦向きの配列に並び替え。 $arrColumn = []; for($i = 0; $i < $sizeN; $i++) { foreach ($arr[$i] as $key => $value) { if (!isset($arrColumn[$key])) { $arrColumn[$key] = []; } $arrColumn[$key][] = $value; } } $ngResult = []; $correctResult = []; // $ngLineRain を下回った配列 for($i = 0; $i < $sizeN; $i++) { foreach ($arrColumn[$i] as $key => $val) { if ($val >= $ngLineRain) { $ngResult[] = $i; break 1; } else { $correctResult[] = $i; } } } // 全て、$ngLineResult を下回った場合、wait を出力して、終わり。 if (count($correctResult) === 0) { echo "wait"; die(); } $ans = ''; if (count($ngResult) >= 1 && $sizeN === 1) { echo 1; die(); } $correctResultMuch = array_count_values($correctResult); $result = ''; foreach ($correctResultMuch as $k => $v) { if ($v === $sizeN) { $result .= $k+1 . ' '; } } echo rtrim($result, ' ');