第6回【JavaScript】数列の最大値、数列の最小値、数列の何番目にある? 、数列の中に何個ある?

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

はじめに

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

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

普段、いわゆる書斎と呼ばれるような、自分の部屋で勉強をしています。たまに気分転換でリビングで勉強をすると、LunaSaki(嫁)や猫たちの視線が気になって集中出来ません。

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

数列の最大値 (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最大値を出力してください。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の最大値を出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5
1 5 4 3 2

出力例

5

ちゃんとループを使った書き方で。しかし、調べてみると、reduce() を使うと良い、らしい。両方でチャレンジしてみよう。(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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  let maxNum = 0;
  for (let tempNum of a) {
      if (tempNum > maxNum) maxNum = tempNum;
  }
  console.log(maxNum);
});
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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  let maxNum = a.reduce(function (x,y) {return Math.max(x,y);});
  console.log(maxNum);
});
Python
N = int(input())
A = list(map(int,input().split()))
maxNum = 0
for i in range(N):
    if A[i] > maxNum:
        maxNm = A[i]
print(maxNum)

数列の最小値 (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最小値を出力してください。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の最小値を出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5
5 1 4 3 2

出力例

1

これは、先ほどとは逆。同様に、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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  let minNum = 100;
  for (let tempNum of a) {
      if (tempNum < minNum) minNum = tempNum;
  }
  console.log(minNum);
});
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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  const minNum = a.reduce(function (x,y){return Math.min(x,y);});
  console.log(minNum);
});
Python
N = int(input())
A = list(map(int,input().split()))
minNum = 100
for i in range(N):
    if A[i] < minNum:
        minNm = A[i]
print(minNum)

数列の何番目にある? (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の何番目に 1 があるか出力してください。
数列の 1 つ目の要素を 1 番目とし、数列には必ず 1 がひとつだけ含まれることとします。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。
・ 数列 a には必ず 1 がひとつだけ含まれる。

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


期待する出力

数列の何番目に 1 があるか出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)
・ 数列 a には必ず 1 がひとつだけ含まれる。


入力例

5
5 1 4 3 2

出力例

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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  for (let i = 0; i < n; i++) {
      if (a[i] == 1) {
          console.log(i+1);
          break;
      }
  }
});
Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    if A[i] == 1:
        print(i+1)
        break

数列の中に何個ある? (paizaランク D 相当)

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の中に 1 が何個あるか出力してください。


入力される値

N
a_1 a_2 ... a_N

・ 1 行目に整数 N が与えられます。
・ 2 行目に長さ N の数列 a が与えられます。

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


期待する出力

数列の中に 1 が何個あるか出力してください。

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


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

・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)


入力例

5
5 1 5 1 5

出力例

2

まずは、ループを使って正攻法で。あと、調べていて filter() というのが面白そうだったので、使ってみたいと思う。

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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  let cnt = 0;
  for (let i = 0; i < n; i++) {
      if (a[i] == 1) cnt++;
  }
  console.log(cnt);
});
JavaScript(filter() を使って)
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 = lines[0];
  const a = lines[1].split(/\s/).map(Number);
  const cnt = a.filter(x => x === 1).length;
  console.log(cnt);
});
Python
N = int(input())
A = list(map(int,input().split()))
cnt = 0
for i in range(N):
    if A[i] == 1:
        cnt += 1
print(cnt)

最後に

調べれば調べるほど、いろいろな書き方が出てきて、更に、それぞれにちゃんと使い道があって、凄く面白かった。こういうときはこの書き方、というのをしっかり理解していかないといけないと思った。

Python に慣れすぎると、カッコの書き忘れとか、セミコロンの付け忘れとか多く発生してしまって、まだまだ反省することばかりです。

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

Python の第6回はこちら