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