標準出力メニュー】> 【行によって長さが違う二次元配列の表示】STEP: 4 すべての行の長さが不定な 2 次元配列の出力 (paizaランク C 相当) [難易度: 1247 ±17]

※リンク先へ移動するためには[paiza]へのログインが必要です。

問題文

自然数 N と N 個の要素の数列 M が与えられます。1 ≦ i ≦ N の各 i について、i 行目には以下の数列を出力してください。
* 1 以上 M_i 以下のすべての自然数を昇順、半角スペース区切りで出力してください。

入力値(例)
4
2 4 3 1

出力値(例)
1 2
1 2 3 4
1 2 3
1

解答例

解説

入力値の1行目の自然数nを標準入力で受け取ります。($n)

入力値の2行目の数列mをexplode()で分割して配列に格納します。($number)

最初のループ処理、 for($i = 0; $i < $n; $i++){ は、繰り返しを0から$n回としています。

$i = 0; を指定しているのは、後で数列mを格納した配列を[0]にして取り出すためです。

そして、2つ目のループ処理、 for($j = 1; $j <= $number[$i]; $j++){ は、繰り返しを1から$i回とし、例えば $number[$i] が2のときは2回で終了となります。

ここからは、実際に受け取った入力値と合わせて確認してみましょう。

入力値
数値m = 2 4 3 1

※読みやすいように半角スペースは_を使います。

1) for($i = 0; の1回目ループ
 ①for($j = 1; の1回目のループ
  if($j == $number[$i]){ → 1==2($number[0]は2なので)
    成立しないので、
    else {
    echo $j. " ";
1_
 ②for($j = 2; の2回目のループ
  if($j == $number[$i]){ → 2==2
    成立するので、
    echo $j. "\n";(改行)
1_2\n
$number[$i]は2なので、1)for($j = 1; の1回目ループは終了
2)for($i = 1; の2回目ループ
 ①for($j = 1; の1回目のループ
  if($j == $number[$i]){ → 1==4($number[1]は4なので)
1_
 ②for($j = 2; の2回目のループ
  if($j == $number[$i]){ → 2==4
1_2_
 ③for($j = 3; の3回目のループ
  if($j == $number[$i]){ → 3==4
1_2_3_
 ④for($j = 4; の3回目のループ
  if($j == $number[$i]){ → 4==4
1_2_3_4\n
3)for($i = 2; の3回目ループ
 ①for($j = 1; の1回目のループ
  if($j == $number[$i]){ → 1==3($number[2]は3なので)
1_
...以下、$i < $nまで続く

感想

はじめは、この問題の意味が分からなくて、自然数nを頂点としたピラミッドを作るのだろうかとかいろいろと考えてしまいました。それと、昇順という言葉にも惑わされて、sort関数を使うのかなとかすっごく悩みました。

この解きかたが分かって、ソートをしなくてもキレイに数字が並べられて、めちゃくちゃ感動しました。

これでランクCとか初心者には難しかったです。さらに上の上位ランクってどんな世界なのか、早く解けるようになりたいです。

おすすめの記事
スポンサーリンク