第16回【JavaScript】二次元配列の出力、二次元配列での要素の検索

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

JavaScript をゼロから勉強してみよう、のコーナー 16 回目です。

とあるフレームワークで、JS を用いることなく非同期通信が出来る機能があったので「JS からの卒業」というタイトルで勉強会を行ったことがあります。オチは、やっぱり JS 必要だよね、でした。

それでは、今日も頑張ってみようと思います。

二次元配列の出力 (paizaランク D 相当)

整数 N , K と N 行 K 列 の二次元配列 A が与えられるので、その配列をそのまま出力してください。


入力される値

N K
A_11 A_12 ... A_1K
...
A_N1 A_N2 ... A_NK

・ 1 行で整数 N , K が半角スペース区切りで与えられます。
・ 続く N 行では、二次元配列 A の各要素が半角スペース区切りで与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

与えられた二次元配列 A を入力と同様の形式で出力してください。

A_11 A_12 ... A_1K
...
A_N1 A_N2 ... A_NK

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N , K ≦ 100
・ 0 ≦ A_ij ≦ 100 (1 ≦ i ≦ N , 1 ≦ j ≦ K)


入力例

3 4
92 15 49 19
20 89 92 47
0 87 42 45

出力例

92 15 49 19
20 89 92 47
0 87 42 45

そのまま出力、と書かれているので、いちいち変数に格納せずにそのまま出力しようかとも思いましたが、何か求められているのは違う気がして・・・、とか考えていたら、Python のときも同じようなことを考えているっぽい。

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++) {
      console.log(a[i].join(' '));
  }
});

二重ループになってないなぁ。ちゃんと二重ループで書くようにしよう。

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++) {
      for (let j = 0; j < k; j++) {
          if (j == k - 1) {
              console.log(a[i][j]);
              break;
          }
          process.stdout.write(a[i][j] + ' ');
      }
  }
});
Python
N,K = map(int,input().split())
A = [input().split() for _ in range(N)]
for i in range(N):
    for j in range(K):
        if j == K - 1:
            print(A[i][j])
        else:
            print(A[i][j],end=" ")

二次元配列での要素の検索 (paizaランク D 相当)

整数 N , K と N 行 K 列 の二次元配列 A が与えられます。 A の要素のうち、1 要素だけ 1 になっている要素があるので、その要素の行と列を出力してください。


入力される値

N K
A_11 A_12 ... A_1K
...
A_N1 A_N2 ... A_NK

・ 1 行で整数 N , K が半角スペース区切りで与えられます。
・ 続く N 行では、二次元配列 A の各要素が半角スペース区切りで与えられます。

入力値最終行の末尾に改行が1つ入ります。


期待する出力

1 になっている要素の行と列を次の形式で出力してください。

行番号 列番号

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。


すべてのテストケースにおいて、以下の条件をみたします。

・ 1 ≦ N , K ≦ 100
・ A_ij は 0 または 1 (1 ≦ i ≦ N , 1 ≦ j ≦ K)
・ 1 であるような A の要素は 1 つ


入力例

6 7
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 1 0 0 0 0 0

出力例

6 2

ちょっと実践的で面白いなぁ。

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++) {
      for (let j = 0; j < k; j++) {
          if (a[i][j] == 1) {
              console.log(i + 1, j + 1);
              break;
          }
      }
  }
});
Python
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
for i in range(N):
    for j in range(K):
        if A[i][j] == 1:
            print(i+1,j+1)

最後に

console.log() も、Python の print() 同様に、カンマ区切りが使える! 何気なくカンマ区切りで書いて動作確認したら、ちゃんと動いた。ので、調べてみると、問題ないらしい。

いつも、+ で半角スペースを繋いでいたので、これはとても便利!

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

Python の第16回はこちら