第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 はスッキリと書けて素敵。
配列をあらかじめ準備しておく方法も使うことがあったけれど、あまり大きくなると使えなくなるので、いろいろな方法を知っておくのは大切だと思った。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません