第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 万人いるクラスとか。あり得ないけど。

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

PythonPython,paiza,学習

Posted by LeoSaki