第88回【JavaScript】重複の判定 1、重複の判定 2

現在取り組んでいるのは、paiza ラーニング問題集「データセット選択メニュー」になります。

はじめに

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

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

どうでしょうで何回も 88 箇所を見ていると、すでに何周も巡ったような気になってしまいます。実際、88 箇所についていろいろと聞かれて、答えられてしまうのです。更に、聖地巡礼よろしく「事件」が発生した場所はほとんど赴いているため、詳細をお話することまで出来てしまうのです。

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

重複の判定 1 (paizaランク C 相当)

N 個の要素からなる数列 A が与えられます。2 ≦ i ≦ N の各 i に対して、A_i と同じ値が A_1 から A_{i-1} の間にあるかどうかを判定してください。


入力される値

N
A_1 A_2 ... A_N

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


期待する出力

N-1 行出力してください。i (1 ≦ i ≦ N-1) 行目には、A_{i+1} と同じ値が A_1 から A_i の間にあるならば「Yes」を、ないならば「No」を 1 行に出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ A_i ≦ 10,000 (1 ≦ i ≦ N)


入力例

9
1 2 3 2 5 3 3 10 2

出力例

No
No
Yes
No
Yes
Yes
No
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]);
  const A = lines[1].split(/\s/).map(Number);
  const temp = Array(10001).fill(0);
  temp[A[0]] = 1;
  for (let i = 1; i < n; i++) {
      a = A[i];
      if (temp[a] == 0) {
          temp[a] = 1;
          console.log('No');
      } else {
          console.log('Yes');
      }
  }
});
Python
N = int(input())
A = [int(x) for x in input().split()]
temp = [0] * 10001
temp[A[0]] = 1
for i in range(1, N):
      a = A[i]
      if temp[a] == 0:
          temp[a] = 1
          print('No')
      else:
          print('Yes')

重複の判定 2 (paizaランク C 相当)

N 個の要素からなる数列 A が与えられます。2 ≦ i ≦ N の各 i に対して、A_i と同じ値が A_1 から A_{i-1} の間にあるかどうかを判定してください。ただし、A_i は非常に大きくなることがあります。


入力される値

N
A_1 A_2 ... A_N

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


期待する出力

N-1 行出力してください。i (1 ≦ i ≦ N-1) 行目には、A_{i+1} と同じ値が A_1 から A_i の間にあるならば「Yes」を、ないならば「No」を 1 行に出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。

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


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

・ 1 ≦ N ≦ 100
・ 1 ≦ A_i ≦ 1,000,000,000


入力例

9
1 2 3 2 5 3 3 10 2

出力例

No
No
Yes
No
Yes
Yes
No
Yes

10 億のリストを作っていてはちょっと対応難しそうなので、ここは、set を利用してみるのはどうだろう。

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);
  const temp = new Set();
  temp.add(A[0]);
  for (let i = 1; i < n; i++) {
      a = A[i];
      if (temp.has(a)) {
          console.log('Yes');
      } else {
          temp.add(a);
          console.log('No');
      }
  }
});
Python
N = int(input())
A = [int(x) for x in input().split()]
temp = {A[0]}
for i in range(1,N):
    if A[i] in temp:
        print('Yes')
    else:
        temp.add(A[i])
        print('No')

最後に

検査項目が少ないときは、配列を利用するパターンを使うことが多い。実際は、set であったり、連想配列であったりを利用した方が早いのかもしれない。

いろんなパターンを覚えて、いろんなパターンを使えるようになっていることが大切だと思うので、ちゃんと手を動かして覚えるようにしようと思います。

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

Python の第88回はこちら