paizaの「整数の並びを半角スペース区切りで入力 2 JavaScript編(paizaランク C 相当)」を解きました。
今回は、
- 1行目:複数の整数
- 2行目:整数1つ
- 3行目:複数の整数
という入力形式でした。
前回の問題で使った、
.split(" ").map(Number)
を使い分ける練習になりました。
問題
整数 A、B、N と、N 個の整数が与えられます。
入力されたすべての値に +1 して、入力された順番に改行区切りで出力します。
入力例
3 5
4
-2 44 29 100
出力例
4
6
5
-1
45
30
101
解答コード
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 input1 = lines[0].split(" ").map(Number);
const N = Number(lines[1]);
const input3 = lines[2].split(" ").map(Number);
console.log(input1[0] + 1);
console.log(input1[1] + 1);
console.log(N + 1);
for (let i = 0; i < N; i++) {
console.log(input3[i] + 1);
}
});
lines の中身
入力が、
3 5
4
-2 44 29 100
だった場合、lines は次のようになります。
[
"3 5",
"4",
"-2 44 29 100"
]
標準入力から受け取った値は、最初はすべて文字列です。
1行目を処理する
1行目は、
3 5
のように、複数の整数が半角スペースで区切られています。
そこで、
const input1 = lines[0].split(" ").map(Number);
とします。
まず、
.split(" ")
で半角スペースごとに分けると、
["3", "5"]
になります。
さらに、
.map(Number)
で、それぞれを数値に変換します。
[3, 5]
そのため、
input1[0]
は 3、
input1[1]
は 5 になります。
2行目を処理する
2行目は、
4
のように整数が1つだけです。
そのため、
const N = Number(lines[1]);
とします。
複数の値ではないので、ここでは split() は必要ありません。
3行目を処理する
3行目は、
-2 44 29 100
のように、再び複数の整数が半角スペースで並んでいます。
そのため、
const input3 = lines[2].split(" ").map(Number);
とします。
結果は、
[-2, 44, 29, 100]
になります。
A、B、Nを+1して出力する
console.log(input1[0] + 1);
console.log(input1[1] + 1);
console.log(N + 1);
入力が、
3 5
4
なら、
4
6
5
と出力されます。
for 文で3行目を順番に処理する
3行目には N 個の整数が入っています。
for (let i = 0; i < N; i++) {
console.log(input3[i] + 1);
}
N = 4 の場合は、
i = 0
i = 1
i = 2
i = 3
の4回繰り返します。
input3 が、
[-2, 44, 29, 100]
なら、
input3[0] + 1
input3[1] + 1
input3[2] + 1
input3[3] + 1
が順番に実行されます。
結果は、
-1
45
30
101
です。
今回のポイント
今回一番大事だったのは、1行に値が1つなのか、複数なのかで処理を変えることです。
値が1つだけの場合
const N = Number(lines[1]);
半角スペース区切りで複数ある場合
const input1 = lines[0].split(" ").map(Number);
const input3 = lines[2].split(" ").map(Number);
この違いを覚えておくと、paizaの標準入力問題がかなり読みやすくなりそうです。
今回つまずいたところ
最初は3行目を、
const input3 = Number(lines[2]);
としてしまいました。
しかし3行目は、
-2 44 29 100
のように複数の数字が入っています。
そのため、1つの数値に変換する Number() ではなく、
.split(" ").map(Number)
を使って配列にする必要がありました。
また、出力では N + 1 も必要でした。
まとめ
今回覚えたことは次の3つです。
Number(lines[i])
→ 1行に数値が1つだけの場合
lines[i].split(" ").map(Number)
→ 1行に複数の数値が半角スペース区切りで並んでいる場合
for (let i = 0; i < N; i++)
→ N 個のデータを順番に処理する場合
前回と似た問題でしたが、自分でもう一度書いて解けたことで、標準入力の扱い方が少しずつ定着してきました。