第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 であったり、連想配列であったりを利用した方が早いのかもしれない。
いろんなパターンを覚えて、いろんなパターンを使えるようになっていることが大切だと思うので、ちゃんと手を動かして覚えるようにしようと思います。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません