第63回【Python】二人三脚
現在取り組んでいるのは、paiza ラーニング問題集「配列活用メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 63 回目です。
前回、朝のルナちゃんのお話をしたので、朝のレオくんのお話。レオくんは、LeoSaki(旦那)と LunaSaki(嫁)の間、頭の辺りで寝ています。レオくん専用の布団があり、LeoSaki(旦那)が寝室へ移動するとついてきて、自分の布団に転がります。超可愛い。
それでは、今日も頑張ってみようと思います。
二人三脚
生徒の身長が A_1, …., A_N であるような N 人のクラスで二人三脚の代表を決めることにしました。代表には、身長の差が最も小さいような 2 人を選出することにしました。選ばれた 2 人の身長を昇順に出力してください。
N
A_1
...
A_N
・1 行目では、クラスの人数 N が半角スペース区切りで与えられます。
・続く N 行では、クラスメイト N 人の身長が与えられます。
すべてのテストケースにおいて、以下の条件をみたします。
・2 ≦ N ≦ 100
・100 ≦ A_i ≦ 200 (1 ≦ i ≦ N)
・代表となるようなペアは 1 組に限られることが保証されています。
5
119
102
187
191
132
問題を読んで、幾つかのパターンが頭に浮かんだ。その中で一番計算量が少なくなるのはどれだろう。と、考えるのが楽しい。
Python
N = int(input())
A = [int(input()) for _ in range(N)]
A.sort()
ans = 101
x,y = 0,0
for i in range(N-1):
if A[i+1] - A[i] < ans:
ans = A[i+1] - A[i]
x,y = A[i],A[i+1]
print(x)
print(y)
模範解答を見ると、二重配列で全パターンを調べているようだけれど、それよりもこっちの方が早いんじゃなかろうか。模範解答っぽいコードは VBA で。
VBA
N = Cells(1, 1)
Dim A() As Integer
ReDim A(N)
diff = 101
ans1 = 0
ans2 = 0
For i = 0 To N - 1
A(i) = Cells(i + 2, 1)
Next
For i = LBound(A) To UBound(A)
For j = i + 1 To UBound(A)
If Abs(A(i) - A(j)) < diff Then
diff = Abs(A(i) - A(j))
If A(i) < A(j) Then
ans1 = A(i)
ans2 = A(j)
Else
ans1 = A(j)
ans2 = A(i)
End If
End If
Next
Next
Debug.Print ans1
Debug.Print ans2
最後に
Python なら sort が簡単にできるのだから、活用するべきだと思った。解答も昇順で出せと言われているし。二重配列よりは計算量も少なくなるんじゃないだろうか。
一方、VBA だと、並べ替えるのも一苦労なので、総当たりで書いてみた。与えられるデータ量が増えると時間がかかってしまいそうな気がする。1,000,000 万人いるクラスとか。あり得ないけど。
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません