第18回【JavaScript】さまざまな長さの配列の和、階段の出力、二重ループ:基本編
現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
JavaScript をゼロから勉強してみよう、のコーナー 18 回目です。
よく、事務所で若い子がゲームの話をしているのですが、さっぱり付いて行けません。昔は結構ゲームをしていたし、LunaSaki(嫁)と知り合ったのも元々はゲームだったんですが。今は、スマホで「つなキャン」をやっているくらいです。ゲームする時間があるなら、勉強しなくちゃ。
それでは、今日も頑張ってみようと思います。
さまざまな長さの配列の和 (paizaランク D 相当)
整数 N が与えられるので、次の処理を N 回してください。
・ 配列のサイズ K とその要素 A1 … AK が与えられるので、全ての要素の和を求めて出力してください。
入力される値
N
K1 A1_1 A1_2 ... A1_K1
...
KN AN_1 AN_2 ... AN_KN
・ 1 行目では整数 N が与えられます。
・ 続く N 行では、初めの各行の配列のサイズ Ki (1 ≦ i ≦ N) と各要素 Ai_j (1 ≦ j ≦ Ki) が半角スペース区切りで与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
N 回の処理の結果 S_1 … S_N を次の形式で出力してください。
S_1
...
S_N
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N , Ki ≦ 100 (1 ≦ i ≦ N)
・ 0 ≦ Ai_j ≦ 100 (1 ≦ i ≦ N , 1 ≦ j ≦ Ki)
入力例
10
12 17 11 44 41 18 12 70 82 72 19 20 97
8 22 36 93 80 28 59 96 57
10 90 27 95 66 57 48 86 43 81 31
13 22 2 52 51 41 28 83 71 52 10 78 9 19
14 11 96 37 0 50 65 3 4 81 64 47 32 46 53
5 73 22 40 29 69
1 35
3 32 4 41
1 73
1 46
出力例
503
471
624
518
589
233
35
77
73
46
問題文をしっかり読んで噛み砕かないと、何を問われているのかが分かりづらい。うーん、日本語をもっと勉強しなさい、ということでしょうか。
JavaScript
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]);
let a = [];
for (let i = 1; i <= n; i++) {
let temp = lines[i].split(/\s/).map(Number);
const k = temp[0];
let ans = 0;
for (let j = 1; j <= k; j++) {
ans += temp[j];
}
console.log(ans);
}
});
せっかく reduce() を覚えたので、reduce() を使って書いてみる。その際、Python の pop(0) みたいなものがないか調べていたら、shift() というのを見つけたので、使ってみる。
JavaScript(reduce() と shift() を利用)
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]);
let a = [];
for (let i = 1; i <= n; i++) {
let temp = lines[i].split(/\s/).map(Number);
const k = temp.shift();
const total = temp.reduce((sum,e) => sum + e, 0);
console.log(total);
}
});
Python
N = int(input())
for _ in range(N):
X = list(map(int,input().split()))
K = X[0]
ans = 0
for i in range(1,K + 1):
ans += X[i]
print(ans)
階段の出力 (paizaランク D 相当)
整数 N が与えられるので、次の規則に従って N 行の出力をしてください。
・ N 行のうち、 i 行目では、1 から i までの数字を半角スペース区切りで出力してください。
例として、 N = 3 のとき、出力は次の通りになります。
1
1 2
1 2 3
入力される値
N
・ 出力する行数 N が 1 行で与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
規則に従って N 行の出力をしてください。
出力の末尾には改行を入れてください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
入力例
5
出力例
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
どこで使うかいまいちわからないけれど、いろんな言語で書かされるパターンのやつ。
JavaScript
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]);
for (let i = 1; i <= n; i++) {
for (let j = 1; j <= i; j++) {
if (j == i) {
console.log(j);
break;
}
process.stdout.write(j + ' ');
}
}
});
Python
N = int(input())
for i in range(1,N + 1):
for j in range(1,i + 1):
if j == i:
print(j)
break
print(j,end=" ")
二重ループ:基本編 積の最大 (paizaランク D 相当)
配列 A と B についての情報が与えられるので、(A の 1 つの要素) × (B の 1 つの要素) の最大値を求めてください。
入力される値
N K
A_1 A_2 ... A_N
B_1 B_2 ... B_K
・ 1 行目では、配列 A の要素数を表す整数 N と配列 B の要素数を表す整数 K が半角スペース区切りで与えられます。
・ 2 行目では、配列 A の各要素が半角スペース区切りで与えられます。
・ 3 行目では、配列 B の各要素が半角スペース区切りで与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
(A の 1 つの要素) × (B の 1 つの要素) の最大値を 1 行で出力してください。
出力の末尾には改行を入れてください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N , K ≦ 100
・ -100 ≦ A_i , B_j ≦ 100 (1 ≦ i ≦ N, 1 ≦ j ≦ K)
入力例
10 10
85 -46 93 44 -40 -75 -75 -18 -54 95
1 95 -92 -90 32 -25 36 55 22 86
出力例
9025
条件としてマイナスがあることに注意。-100 と 100 の組しか存在していなかったら、最大値は -10000 になってしまう。
JavaScript
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,k] = lines[0].split(/\s/).map(Number);
const a = lines[1].split(/\s/).map(Number);
const b = lines[2].split(/\s/).map(Number);
let maxNum = -10000;
for (let i = 0; i < n; i++) {
for (let j = 0; j < k; j++) {
const ab = a[i] * b[j];
if (maxNum < ab) maxNum = ab;
}
}
console.log(maxNum);
});
Python
N,K = map(int,input().split())
A = [int(x) for x in input().split()]
B = [int(x) for x in input().split()]
max_ans = -10000
for i in range(N):
for j in range(K):
ab = A[i] * B[j]
if max_ans < ab:
max_ans = ab
print(max_ans)
最後に
もっと素敵な書き方があるんだろうなぁ、と思いながら、基本に忠実に書きました。条件が巨大な数字になったときとか、新たな方法を探る必要がある気はしています。
まだまだ勉強を始めたばかり。さすがにこのくらいはスラスラと書くことが出来ていますが、もっと他に便利な方法があるはずだ、と調べ始めると止まりません。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません