第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 は触っていないので、忘れかけている! これはまずい。

引き続き、よろしくお願いいたします!

Python の第17回はこちら