第17回【JavaScript】二次元配列の最大の要素、二次元配列の行ごとの和
現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
JavaScript をゼロから勉強してみよう、のコーナー 17 回目です。
事務所の掃除機はダイソンの充電式なのですが、誰かが電源コードを抜いたまま放置していました。いざ使おうとするとバッテリー切れで動きません。困りました。困り果てました。まぁ、充電されるのを待つ以外にないんですけれど。電源コード、抜いたら刺そう。というか、抜くな。
それでは、今日も頑張ってみようと思います。
二次元配列の最大の要素 (paizaランク D 相当)
整数 N , K と N 行 K 列 の二次元配列 A が与えられます。 A の要素のうち、最大の要素の値を出力してください。
入力される値
N K
A_11 A_12 ... A_1K
...
A_N1 A_N2 ... A_NK
・ 1 行で整数 N , K が半角スペース区切りで与えられます。
・ 続く N 行では、二次元配列 A の各要素が半角スペース区切りで与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
A の要素のうち、最大の要素の値を 1 行で出力してください。
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N , K ≦ 50
・ 0 ≦ A_ij ≦ 1000 (1 ≦ i ≦ N , 1 ≦ j ≦ K)
入力例
3 3
226 409 419
491 524 82
417 954 751
出力例
954
一元配列として全数値を入れて、Math.max() で求めるとかは、二重ループメニューに即していないのでダメなんだろうなぁ。
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);
let a = [];
let ans = 0;
for (let i = 1; i <= n; i++) {
a.push(lines[i].split(/\s/).map(Number));
}
for (let i = 0; i < n; i++) {
for (let j = 0; j < k; j++) {
if (a[i][j] > ans) ans = a[i][j];
}
}
console.log(ans);
});
Python
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
ans = 0
for i in range(N):
for j in range(K):
if A[i][j] > ans:
ans = A[i][j]
print(ans)
二次元配列の行ごとの和 (paizaランク D 相当)
整数 N , K と N 行 K 列 の二次元配列 A が与えられるので、 A の行ごとの和を出力してください。
入力される値
N K
A_11 A_12 ... A_1K
...
A_N1 A_N2 ... A_NK
・ 1 行で整数 N , K が半角スペース区切りで与えられます。
・ 続く N 行では、二次元配列 A の各要素が半角スペース区切りで与えられます。
入力値最終行の末尾に改行が1つ入ります。
期待する出力
与えられた二次元配列 A の i 行目の和 S_i (1 ≦ i ≦ N) を次の形式で出力してください。
S_1
...
S_N
また、末尾に改行を入れ、余計な文字、空行を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N , K ≦ 100
・ 0 ≦ A_ij ≦ 100 (1 ≦ i ≦ N , 1 ≦ j ≦ K)
入力例
3 3
1 2 3
4 5 6
7 8 9
出力例
6
15
24
二重ループメニューに忠実に解いてみるのと、この間学んだばかり、reduce() を利用した書き方にも挑戦してみようと思う。
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);
let a = [];
for (let i = 1; i <= n; i++) {
a.push(lines[i].split(/\s/).map(Number));
}
for (let i = 0; i < n; i++) {
let total = 0;
for (let j = 0; j < k; j++) {
total += a[i][j]
}
console.log(total);
}
});
JavaScript(reduce() を利用)
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);
let a = [];
for (let i = 1; i <= n; i++) {
a.push(lines[i].split(/\s/).map(Number));
}
for (let i = 0; i < n; i++) {
const total = a[i].reduce((sum,e)=> sum + e, 0);
console.log(total);
}
});
Python
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
for i in range(N):
ans = 0
for j in range(K):
ans += A[i][j]
print(ans)
最後に
reduce() はなんだか特殊だけれど、とても使い勝手が良くて面白い。完璧に使いこなすことが出来るようにもっと勉強したいと思った。
そもそも、アロー関数に慣れていなくて、その勉強からやっているので、時間がいくらあっても足りない。そういえば、Java のラムダ式はアロー演算子で -> だったなぁ、とか古い記憶を辿って思い出した。最近、まったく Java は触っていないので、忘れかけている! これはまずい。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません