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

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

はじめに

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

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

四国と言えば、88(エイティーエイト)じゃないですか。打首さんも歌ってるじゃないですか。どうでしょうが 3 周もした四国。2 周目で近道だと走った薄暗い山道、キャンプ場あるぞ、泊まってくか? のキャンプ場は、もうありません。その近くのキャンプ場は、LunaLeo(夫婦)のお気に入りキャンプ場の一つです。

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

重複の判定 1

N 個の要素からなる数列 A が与えられます。2 ≦ i ≦ N の各 i に対して、A_i と同じ値が A_1 から A_{i-1} の間にあるかどうかを判定してください。N-1 行出力してください。i (1 ≦ i ≦ N-1) 行目には、A_{i+1} と同じ値が A_1 から A_i の間にあるならば「Yes」を、ないならば「No」を 1 行に出力してください。

N
A_1 A_2 ... A_N

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

・ 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

なんか問題文が分かりづらい。次の問題も見据えて、最初に思いついたやり方とは違う、模範解答にあったやり方で書いてみる。なお、このやり方は、次の問題ではちょっと破綻する。

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')
VBA
N = Cells(1, 1)
a = Split(Cells(2, 1), " ")
Dim temp(10001) As Integer
temp(a(0)) = 1
For i = 1 To UBound(a)
    v = a(i)
    If temp(v) = 1 Then
        Debug.Print "Yes"
    Else
        temp(v) = 1
        Debug.Print "No"
    End If
Next

重複の判定 2

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

N
A_1 A_2 ... A_N

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

・ 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 億になったらしい。10 億のリストを作るというのは現実的ではないので、別のやり方を模索する。

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')
VBA
N = Cells(1, 1)
a = Split(Cells(2, 1), " ")
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
dic.Add a(0), a(0)
For i = 1 To UBound(a)
    If dic.exists(a(i)) Then
        Debug.Print "Yes"
    Else
        dic.Add a(i), a(i)
        Debug.Print "No"
    End If
Next

最後に

2 問目の方法の VBA だと、連想配列に値に入れるものがないため、別の人が見たら何をしているのかわからないかもしれない。それでも、早い方法ではあるんだと思う。Python はスッキリと書けて素敵。

配列をあらかじめ準備しておく方法も使うことがあったけれど、あまり大きくなると使えなくなるので、いろいろな方法を知っておくのは大切だと思った。

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

PythonPython,paiza,学習

Posted by LeoSaki