paizaの「ある数字までの出力 2」という問題をJavaScriptで解きました。
今回は、正の整数 N が与えられたときに、1 から N までの整数を順番に改行区切りで出力します。
問題
正の整数 N が与えられます。
1 から N までの整数を、1 から順番に改行区切りで出力します。
入力される値
N
入力例1
1
出力例1
1
入力例2
5
出力例2
1
2
3
4
5
回答コード
process.stdin.resume();
process.stdin.setEncoding("utf8");
// 自分の得意な言語で
// Let's チャレンジ!!
var lines = [];
var reader = require("readline").createInterface({
input: process.stdin,
output: process.stdout
});
reader.on("line", (line) => {
lines.push(line);
});
reader.on("close", () => {
const N = Number(lines[0]);
for (let i = 1; i <= N; i++) {
console.log(i);
}
});
paizaにもともと入っているコード
今回、次の部分は自分で一から書いたものではありません。
paizaのJavaScriptの解答欄に、標準入力を受け取るためのコードとして最初から用意されていました。
process.stdin.resume();
process.stdin.setEncoding("utf8");
// 自分の得意な言語で
// Let's チャレンジ!!
var lines = [];
var reader = require("readline").createInterface({
input: process.stdin,
output: process.stdout
});
reader.on("line", (line) => {
lines.push(line);
});
reader.on("close", () => {
入力された内容は、lines という配列に1行ずつ入ります。
今回の入力は1行だけなので、入力された値は lines[0] に入ります。
自分で追加したコード
今回、自分で追加した主な処理は次の部分です。
const N = Number(lines[0]);
for (let i = 1; i <= N; i++) {
console.log(i);
}
入力された値を数値に変換する
const N = Number(lines[0]);
標準入力から受け取った値は、最初は文字列として扱われます。
入力が次の場合、
5
lines[0] の中身は文字列の "5" です。
lines[0] // "5"
今回は数値として比較するため、Number() を使って数値に変換します。
Number("5") // 5
その結果を変数 N に代入しています。
const N = Number(lines[0]);
処理の流れは次のようになります。
lines[0] // "5"
Number(lines[0]) // 5
const N = 5;
for文を使って繰り返す
for (let i = 1; i <= N; i++) {
console.log(i);
}
for 文は、同じ処理を繰り返したいときに使います。
基本の形は次のとおりです。
for (初期化; 条件; 増減) {
繰り返す処理
}
今回のコードを分けて見ると、次のようになります。
for (
let i = 1;
i <= N;
i++
) {
console.log(i);
}
それぞれの意味を確認します。
let i = 1
let i = 1;
繰り返しに使う変数 i を作り、最初の値として 1 を入れています。
今回は 1 から出力するため、i を 1 から始めます。
i = 1
i <= N
i <= N;
i が N 以下の間、処理を繰り返します。
<= は「以下」という意味です。
例えば、N が 5 の場合は、次の条件になります。
i <= 5
i が 1、2、3、4、5 の間は繰り返します。
i が 6 になると、
6 <= 5
は成立しないため、繰り返しを終了します。
i++
i++;
i++ は、i の値を1増やすという意味です。
i = i + 1;
と同じ意味です。
例えば、i が 1 の場合、
i++;
を実行すると、i は 2 になります。
1 → 2
次の繰り返しでは、さらに1増えて 3 になります。
2 → 3
このように、1回処理するたびに i が1ずつ増えていきます。
console.log(i)
console.log(i);
現在の i の値を出力します。
console.log() は、出力の末尾に改行を入れます。
そのため、繰り返しのたびに console.log(i) を実行すると、次のように改行区切りで表示されます。
1
2
3
4
5
入力が5の場合の流れ
入力が次の場合、
5
最初に、N には数値の 5 が入ります。
const N = 5;
その後、for 文が実行されます。
1回目
i = 1
条件を確認します。
1 <= 5 // true
条件が成立するため、1 を出力します。
1
その後、i++ によって i が 2 になります。
2回目
i = 2
条件を確認します。
2 <= 5 // true
2 を出力します。
2
その後、i が 3 になります。
3回目
i = 3
条件が成立するため、3 を出力します。
4回目
i = 4
条件が成立するため、4 を出力します。
5回目
i = 5
条件を確認します。
5 <= 5 // true
5 も N 以下なので出力されます。
6回目
i++ により、i は 6 になります。
i = 6
条件を確認します。
6 <= 5 // false
条件が成立しないため、繰り返しを終了します。
最終的な出力は次のとおりです。
1
2
3
4
5
なぜ i < N ではなく i <= N なのか
今回の問題では、N も出力する必要があります。
そのため、条件を次のように書きます。
i <= N
例えば、N が 5 の場合、
5 <= 5
は成立するため、5 も出力されます。
一方、次のように書いた場合、
i < N
これは「i が N より小さい間」という意味です。
N が 5 の場合、
5 < 5
は成立しません。
そのため、出力は 4 までになってしまいます。
1
2
3
4
今回は N まで出力する必要があるため、< ではなく <= を使います。
Nが1の場合
入力が次の場合、
1
N は 1 になります。
const N = 1;
for 文の最初の値も 1 です。
let i = 1;
条件を確認すると、
1 <= 1
は成立します。
そのため、1 が出力されます。
1
その後、i++ によって i が 2 になります。
2 <= 1
は成立しないため、繰り返しを終了します。
まとめて文字列を作る方法
今回のコードでは、console.log() を繰り返しの中で実行しています。
for (let i = 1; i <= N; i++) {
console.log(i);
}
別の方法として、出力する内容を1つの文字列にまとめてから出力することもできます。
reader.on("close", () => {
const N = Number(lines[0]);
let result = "";
for (let i = 1; i <= N; i++) {
result += i + "\n";
}
console.log(result.trimEnd());
});
\n は改行を表します。
result += i + "\n";
ただし、今回の問題では、繰り返しの中で console.log(i) を使う書き方のほうがシンプルです。
for (let i = 1; i <= N; i++) {
console.log(i);
}
今回覚えたこと
- 1行目の入力は
lines[0]で取り出せる - 標準入力から受け取った値は最初は文字列になる
-
Number()で文字列を数値に変換できる -
for文を使うと同じ処理を繰り返せる -
let i = 1で繰り返しを1から始められる -
i <= NでNまで繰り返せる -
i++でiを1ずつ増やせる -
console.log()は出力後に改行する -
1からNまで出力するときはi < Nではなくi <= Nを使う