paizaの「整数の並びを半角スペース区切りで入力 1 JavaScript編(paizaランク C 相当)」を解きました。
今回のポイントは、
- 標準入力から受け取った値は文字列
- 半角スペース区切りの文字列を配列にする
- 配列の各値を数値に変換する
-
for文で1つずつ+1して出力する
というところです。
問題
整数 N と、N 個の整数の並びが与えられます。
それぞれの値に +1 して、改行区切りで出力します。
入力例
3
12 4 -2
出力例
4
13
5
-1
今回は、出力例を見ると N にも +1 しています。
解答コード
process.stdin.resume();
process.stdin.setEncoding('utf8');
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]);
const input = lines[1].split(" ").map(Number);
console.log(N + 1);
for (let i = 0; i < input.length; i++) {
console.log(input[i] + 1);
}
});
入力された値を確認する
入力が、
3
12 4 -2
の場合、lines の中身は次のようになります。
[
"3",
"12 4 -2"
]
ここで注意したいのは、入力された値は最初は文字列として扱われることです。
N を数値に変換する
const N = Number(lines[0]);
lines[0] は、
"3"
という文字列です。
そのため、Number() を使って、
3
という数値に変換します。
もし数値に変換せず、
const N = lines[0];
console.log(N + 1);
とすると、
31
と出力されてしまいます。
JavaScriptでは、
"3" + 1
は数値の足し算ではなく、文字列の連結として扱われるためです。
半角スペースで分割する
2行目は、
12 4 -2
という1つの文字列になっています。
そこで、
const input = lines[1].split(" ");
とすると、半角スペースごとに分割できます。
["12", "4", "-2"]
ただし、まだそれぞれは文字列です。
.map(Number) で数値に変換する
そこで、
const input = lines[1].split(" ").map(Number);
とします。
すると、
[12, 4, -2]
という数値の配列になります。
つまり、
.split(" ")
で文字列を分割して、
.map(Number)
で配列の中身をすべて数値に変換しています。
for 文で1つずつ+1する
for (let i = 0; i < input.length; i++) {
console.log(input[i] + 1);
}
input は、
[12, 4, -2]
なので、順番に処理されます。
1回目
input[0] + 1
12 + 1 = 13
2回目
input[1] + 1
4 + 1 = 5
3回目
input[2] + 1
-2 + 1 = -1
console.log() は呼ばれるたびに改行されるため、
13
5
-1
と出力されます。
処理の流れ
今回のコードでは、次の順番で処理しています。
標準入力
↓
linesに1行ずつ保存
↓
lines[0]をNumber()で数値に変換
↓
lines[1]をsplit(" ")で分割
↓
map(Number)で数値の配列に変換
↓
for文で1つずつ取り出す
↓
+1してconsole.log()で出力
今回覚えたこと
標準入力は文字列として受け取る
const N = Number(lines[0]);
計算したい場合は、数値への変換が必要です。
半角スペース区切りの入力はsplit(" ")
lines[1].split(" ");
配列の中身をまとめて数値に変換する
.map(Number)
配列を順番に処理する
for (let i = 0; i < input.length; i++) {
console.log(input[i] + 1);
}
今回特に大事なのは、標準入力で受け取った値は文字列なので、そのまま計算しないことです。
Number() と .map(Number) は、今後のpaizaの標準入力問題でもよく使いそうです。