0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

すべての "行の長さが不定" な 2 次元配列の出力

Posted at

i = 1 で書いて出力がズレるミス💦
配列のインデックス、基本なのにたまにやらかすんだよな…。
最近解いてる標準出力問題について記録するよ!


問題概要

N(行数)と N 個の数列 M(各行の長さ)が与えられ、i 行目には、1 以上 M_i 以下の自然数を昇順・スペース区切りで出力する問題。1 ≦ i ≦ N


入力例:

4  
2 4 3 1  

出力例:

1 2  
1 2 3 4  
1 2 3  
1  

NG例

const N = Number(lines[0]);
const nums = lines[1].split(" ").map(Number);
    
    for (let i = 1; i < N; i++) {  // ← i=1 で始めてしまった💦
        for (let k = 1; k <= nums[i]; k++) {
            if (k === nums[i]) {
                process.stdout.write(k + "\n");
            } else {
                process.stdout.write(k + " ");
            }
        }
    }

ミスの原因:
✅ 配列のインデックスは 0 から始まるのに、1 から回して1行目がスキップ!
N は「行数」、nums[i] は「各行の長さ」なので、ズレると悲惨


OK例

const N = Number(lines[0]);  
const nums = lines[1].split(" ").map(Number);  

for (let i = 0; i < N; i++) {  // i=0 から開始する
    let output = [];
    for (let k = 1; k <= nums[i]; k++) {  
        output.push(k);
    }
    console.log(output.join(" "));  
}

ポイント:
i=0 から始めて全行を処理
output.join(" ") でスペース区切りをラクに管理


別解: Array.from() をつかう

const N = Number(lines[0]);  
const nums = lines[1].split(" ").map(Number);  

for (let i = 0; i < N; i++) {
    console.log(Array.from({ length: nums[i] }, (_, k) => k + 1).join(" "));
}

解説:
Array.from({ length: nums[i] }, (_, k) => k + 1)1 ~ M_i の配列を作成!
join(" ") で一発フォーマット


まとめ

for 文の i、ちゃんと 0 から始めよう!
join(" ") で出力整形を簡単に!
Array.from() を使えば、スマートな配列生成ができる!

意外とハマるインデックスズレ、今後はもうミスらない…はず!


僕の失敗談と解決話!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?