第96回【JavaScript】3の倍数のカウント、フラグ管理

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

はじめに

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

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

LeoSaki(旦那)は、やるべき作業は出来る限り前倒しで行う主義です。ちょっとしたメール返信であっても、メンバーの勤怠管理であっても、重みは変わりません。もちろん、やるべきことが多く重なったときは重み付けをしますが。

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

3の倍数のカウント (paizaランク D 相当)

正整数 n と、 n 個の整数 a_1, …, a_n が半角スペース区切りで与えられます。
与えられた整数の中に 3 の倍数がいくつあるかを数え、出力してください。


入力される値

n
a_1 a_2 ... a_n

1 行目に正整数 n が、 2 行目に n 個の整数 a_1, …, a_n が半角スペース区切りで与えられます。

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


期待する出力

与えられた整数の中に3の倍数がいくつあるかを出力してください。

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


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

・n および各 a_i (1 ≤ i ≤ n) は 1 以上 50 以下の整数


入力例

2
4 3

出力例

1

3 でナベアツを思い浮かべる人がどのくらいいるのだろうか。

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

フラグ管理 (paizaランク D 相当)

正整数 n と n 個の整数 a_1, …, a_n が改行区切りで与えられるので、各 a_i (1 ≤ i ≤ n) が 7 であるか判定し、 a_1, …, a_n の中に 7 がひとつでも含まれていた場合には “YES" を、そうでない場合(7 がひとつも含まれていなかった場合)には “NO" を出力してください。


入力される値

n
a_1
...
a_n

1 行目には正整数 n が与えられ、 2 行目から (n + 1) 行目には n 個の整数 a_1, …, a_n が改行区切りで与えられます。

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


期待する出力

a_1, …, a_n の中に 7 がひとつでも含まれていた場合には “YES" を、そうでない場合には “NO" を出力してください。

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


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

・ n および各 a_i (1 ≤ i ≤ n)は 1 以上 50 以下の整数


入力例

2
7
1

出力例

YES

フラグ管理で解きなさい、ということだろうか。

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 flg = false;
  for (let i = 1; i <= n; i++) {
      const a = Number(lines[i]);
      if (a == 7) {
          flg = true;
      }
  }
  if (flg) {
      console.log('YES');
  } else {
      console.log('NO');
  }
});
JavaScript(return を使う)
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++) {
      const a = Number(lines[i]);
      if (a == 7) {
          return console.log('YES');
      }
  }
  console.log('NO');
});
Python
N = int(input())
for _ in range(N):
    a = int(input())
    if a == 7:
        print('YES')
        break
else:
    print('NO')

最後に

return を使った書き方の方が、なんとなく JavaScript っぽい気がします。もちろん、break を利用して抜ける方法も知っておく必要があると思います。

フラグ管理の書き方であれば、ちゃんと break 分で抜けておけば、7 と等しいかどうかを調べる回数が減って、少しだけ早くなるかもしれません。数列が最大値の 50 あって、先頭に 7 がある場合、無駄に 49 回 7 と等しいかどうかを調べるわけですし。

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

Python の第96回はこちら