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() を使えば、スマートな配列生成ができる!
意外とハマるインデックスズレ、今後はもうミスらない…はず!