第13回【Python】加算された数列の最大値、加算された数列の最小値、1 はどこにある?

2023年10月18日

現在取り組んでいるのは、paiza ラーニング問題集「ループメニュー 2」になります。

はじめに

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

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

LunaSaki(嫁)の誕生日が 13 日なので、12 続いて、13 という数字も好き。欧米では忌み嫌われる数字というイメージですが、ここはジャパーン。LunaSaki(嫁)の誕生日が金曜日であっても気にしない。だって、ここはジャパーン。

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

加算された数列の最大値

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、a_1 , … , a_N の最大値を出力してください。

ちょっと分かりづらい問題だけれども。1 番目の数字に 1 を足す、2 番目の数字に 2 を足す、3 番目の数字に 3 を足す・・・で、その中で最大値を求める、ってことでしょうかね。

Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    A[i] += i + 1
print(max(A))

書いてから思ったのが、これは計算量が多すぎる。リストを 2 回攫わないといけない。

Python
N = int(input())
A = list(map(int,input().split()))
ans = 0
for i in range(N):
    ans = max(ans, A[i] + (i + 1))
print(ans)

加算しながら比較を行えば、最初の 1 回で済む。

VBA でも同じ感じに書けるかな?

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
ans = 0
For i = 0 To UBound(A)
    ans = Application.WorksheetFunction.Max(ans, A(i) + (i + 1))
Next
Debug.Print ans

WorksheetFunction を使うのはズルい? あるものは使わないと・・・。

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
ans = 0
For i = 0 To UBound(A)
    If ans < A(i) + (i + 1) Then ans = A(i) + (i + 1)
Next
Debug.Print ans

VBA での WorksheetFunction はとっても便利。まぁ、Python の組み込み関数とあまり変わらないけど。

加算された数列の最小値

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_i に i を足したとき、N 個の整数の最小値を出力してください。

すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 1 ≦ a_i ≦ 100

ふむ。今度は最小値を出力しろ、ということですか。

Python
N = int(input())
A = list(map(int,input().split()))
ans = 1000
for i in range(N):
    ans = min(ans, A[i] + (i + 1))
print(ans)

気を付けるべきは、変数 ans に入れる値ですね。先ほどの答えをコピペして、max を min に変更しただけでは、最小値は 0 になってしまう。それをやった人は誰か? LeoSaki(旦那)です。

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
ans = 1000
For i = 0 To UBound(A)
    ans = Application.WorksheetFunction.Min(ans, A(i) + (i + 1))
Next
Debug.Print ans

ここも、同様に、ans の値にさえ気を付けていれば、間違いないはず!

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
ans = 1000
For i = 0 To UBound(A)
    If ans > A(i) + (i + 1) Then ans = A(i) + (i + 1)
Next
Debug.Print ans

1 はどこにある?

N 個の整数 a_1, a_2, …, a_N が与えられます。
a_1, a_2, …, a_N のうち、1 がある位置を先頭から順に改行区切りで出力してください。
a_1 を 1 番目とし、a_1, a_2, …, a_N には少なくとも 1 個は 1 が含まれます。

配列から 1 の位置を探せ、という問題。イチの位置を探せって狙ったのかなぁ。

Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
    if A[i] == 1:
        print(i+1)

a_1 を 1 番目としろ、ということなので、print する数値は i+1 でないといけない。

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
For i = 0 To UBound(A)
    If A(i) = 1 Then Debug.Print i + 1
Next

これも Python とほとんど同じ感じで問題なさそう。

最後に

会社で VBA をよく触っていた人が、Python って簡単っすよ、って言ってた。確かに、ここまでやってきた内容を見ると、すごく学習しやすそうに感じる。

LeoSaki(旦那)は PHP をよく使っていたので、Python って分かりやすいなぁって思う反面、閉じカッコがないので不安になってしまう。

いや、面白いんですけどね。内包表記とか理解できてからは、より一層面白さを感じている。

早く何かを作ってみたい。そのためにも、もっと効率の良い書き方を学習して、自由に使いこなせるようになりたい。

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

Python学習,Python,paiza

Posted by LeoSaki