第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
Yes10 億のリストを作っていてはちょっと対応難しそうなので、ここは、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 であったり、連想配列であったりを利用した方が早いのかもしれない。
いろんなパターンを覚えて、いろんなパターンを使えるようになっていることが大切だと思うので、ちゃんと手を動かして覚えるようにしようと思います。
引き続き、よろしくお願いいたします!


 https://paiza.jp/works
 https://paiza.jp/works
 https://paiza.jp/works/mondai/data_structure/data_structure_...
 https://paiza.jp/works/mondai/data_structure/data_structure_...
 https://paiza.jp/works/mondai/data_structure/data_structure_...
 https://paiza.jp/works/mondai/data_structure/data_structure_...
 https://luna-leo.com/2023/07/07/post-2325/
 https://luna-leo.com/2023/07/07/post-2325/


ディスカッション
コメント一覧
まだ、コメントがありません