【配列に対しての複雑な処理】FINAL問題 【配列に対しての複雑な処理】集団行動 (paizaランク C 相当) – PHP編【配列活用メニュー】
【配列活用メニュー】 > 【配列に対しての複雑な処理】FINAL問題 【配列に対しての複雑な処理】集団行動 (paizaランク C 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。
解答例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
<?php $input = explode(" ",trim(fgets(STDIN))); $n = $input[0]; $k = $input[1]; $array = array(); for($i = 0;$i < $n;$i++){ array_push($array,$i+1); } $copy = $array; for($i = 0;$i < $k;$i++){ $test = explode(" ",trim(fgets(STDIN))); if($test[0] == "swap" ){ $a = $test[1]-1; $b = $test[2]-1; $array[$a] = $copy[$b]; $array[$b] = $copy[$a]; $copy = $array; } elseif($test[0] == "reverse"){ $array = array_reverse($array); $copy = $array; } elseif($test[0] == "resize"){ $count = count($array); $unset = $count - $test[1]; if($count <= $test[1]){ } else{ array_splice($array,$test[1],$unset); $copy = $array; } } } foreach($array as $value){ echo $value."\n"; } ?> |
3つの動作・swap A B
先頭から A 番目の人と、先頭から B 番目の人の位置を入れ替える。
・reverse
列の前後を入れ替える。
・resize C
先頭から C 人を列に残し、それ以外の人を全員列から離れさせる。ただし、列が既に C 人以下の場合、何も行わない。
先頭から A 番目の人と、先頭から B 番目の人の位置を入れ替える。
・reverse
列の前後を入れ替える。
・resize C
先頭から C 人を列に残し、それ以外の人を全員列から離れさせる。ただし、列が既に C 人以下の場合、何も行わない。
動作の中に「A番目とB番目の人を入れ替える」というものがあります。このことから一度、配列のコピーを取りながら要素を入れ替えます。コピー配列からAとBの要素を取り出し、オリジナル配列に入れ込む。そしてオリジナルの配列をコピーに上書き、この動作の処理を繰り返しながら答えを導いていきます。
・各データの取得、1~Nまでの配列作成、コピー配列の作成
|
1 2 3 4 5 6 7 8 |
$input = explode(" ",trim(fgets(STDIN))); //標準入力からデータ取得 $n = $input[0]; //配列の末尾の値、Nを取得 $k = $input[1]; //動作の回数kを取得 $array = array(); //空の配列を作成 for($i = 0;$i < $n;$i++){ array_push($array,$i+1); //空の配列に1~Nの値を入れていく } $copy = $array; //コピー配列の作成 |
・各動作の処理(「swap A B」、「reverse」、「resize C」)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
for($i = 0;$i < $k;$i++){ $test = explode(" ",trim(fgets(STDIN))); if($test[0] == "swap" ){ //swapの動作開始 $a = $test[1]-1; $b = $test[2]-1; $array[$a] = $copy[$b]; //オリジナル配列[a]にコピー配列[b]を入れる $array[$b] = $copy[$a]; //オリジナル配列[b]にコピー配列[a]を入れる $copy = $array; //コピー配列にオリジナル配列を入れる } elseif($test[0] == "reverse"){ //reverseの動作開始 $array = array_reverse($array); //配列を反転させる $copy = $array; //コピー配列にオリジナル配列を入れる } elseif($test[0] == "resize"){ $count = count($array); //配列の要素数を取得 $unset = $count - $test[1]; //削除の開始位置を取得 if($count <= $test[1]){ //なにも記述していません。列がC人以下の場合何もしない } else{ array_splice($array,$test[1]); //削除の開始位置から残りの配列を削除する $copy = $array; //コピー配列にオリジナル配列を入れる } } } |
