第6回【Python】数列の最大値、数列の最小値、数列の何番目にある? 、数列の中に何個ある?
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 6 回目です。
paiza ラーニングで学習しています。
お題の 4 問は、この章のテーマ「ループ」を意識しなければ、一瞬で書けてしまうものばかり。挑戦してみたいと思います。
数列の最大値
長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最大値を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)
LeoSaki(旦那)は知っている。リスト内の最大値を一瞬で求めることができる魔法の言葉を。下町のプリンス、東くんの自己紹介ギャグと言えば・・・かなり寒くなったところで、解答を考える。
Python
input()
A = map(int,input().split())
print(max(A))
あずマーーーーーックス。
ループを使っていないことを理由にペケをつけられたとしても、徹底抗戦するくらいの勢い。しかし、タブチ先生に平手打ちを頂いたら、認めざるを得ない。
ループを使って書こう。
Python
N = int(input())
A = list(map(int,input().split()))
maxNum = 0
for i in range(N):
if A[i] > maxNum:
maxNm = A[i]
print(maxNum)
よくあるやつなので、難しくはない。条件として数列の最小値が 0 となっているので、maxNum の初期値を 0 より大きい数、例えば 1 にしてしまうと、数列が 0 の並びの場合、対応できなくなってしまう。
VBA で書くと、ループを使った書き方とほぼ同じになる。
VBA
A = Split(Cells(2, 1), " ")
maxNum = 0
For i = 0 To UBound(A)
If Val(A(i)) > maxNum Then
maxNum = A(i)
End If
Next
Debug.Print maxNum
型を意識することだけは忘れないようにしよう。やっぱり、option explicit は必要なんじゃないかな。
数列の最小値
長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最小値を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)
これは、先ほどの問題、数列の最大値とほぼ変わらない。
Python
input()
A = map(int,input().split())
print(min(A))
取り急ぎ、タブチ先生に平手打ちを頂く前に、ループを使ったコードも書いておこう。
Python
N = int(input())
A = list(map(int,input().split()))
minNum = 100
for i in range(N):
if A[i] < minNum:
minNm = A[i]
print(minNum)
今度は、数列の最大値が 100 となっているので、最小値を保持する変数 minNum に 100 を代入しておく。
VBA も変わらない。
VBA
A = Split(Cells(2, 1), " ")
minNum = 100
For i = 0 To UBound(A)
If Val(A(i)) < minNum Then
minNum = A(i)
End If
Next
Debug.Print minNum
ちなみに、varType(minNum) で型を調べてみると、8 が返される。string 型のようだ。
数列の何番目にある?
長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の何番目に 1 があるか出力してください。
数列の 1 つ目の要素を 1 番目とし、数列には必ず 1 がひとつだけ含まれることとします。
注意すべきは、数列の 1 つ目の要素を 1 番目とする、というところ。Python のインデックスは 0 からスタートするので、きちんと意識しないと間違えてしまいそう。
Python
input()
A = list(map(int,input().split()))
print(A.index(1)+1)
インデックスを 1 つ増やしてやれば良いので、list.index で取得した値を +1 している。しかし、主題であるループには沿っていないので書き直す。
Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N):
if A[i] == 1:
print(i+1)
break
必ず 1 がひとつだけ含まれているとのことなので、while 文でもいい気がするけれど、とりあえずはこれで。きちんと break で for 文を抜けてあげるのが大事。1 億個並んだ数列の 1 番目に 1 が表れたのに for 文を抜けていなければ、無駄に 9999万9999 回ループしなければいけなくなってしまう。
VBA でも書いてみる。
VBA
A = Split(Cells(2, 1), " ")
For i = 0 To UBound(A)
If A(i) = 1 Then
Debug.Print i + 1
Exit For
End If
Next
数列の中に何個ある?
長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の中に 1 が何個あるか出力してください。
1 をカウントすればいいのか。
Python
N = int(input())
A = list(map(int,input().split()))
print(A.count(1))
ああ、タブチ先生が見ている。すぐにループで書き直そう。
Python
N = int(input())
A = list(map(int,input().split()))
cnt = 0
for i in range(N):
if A[i] == 1:
cnt += 1
print(cnt)
for a in A: と書いてもいいと思うのだけれど、与えられた値をすべて使うのが、100 点満点への近道だと思うんだ。for a in A: と書いてしまったら、N という値を使わずに終わってしまうから。
まぁ、そんなことすべて無視して、書きたいように書く、VBA のコーナー。
VBA
A = Split(Cells(2, 1), " ")
cnt = 0
For i = 0 To UBound(A)
If A(i) = 1 Then cnt = cnt + 1
Next
Debug.Print cnt
VBA では代入演算子が使えないので、cnt という変数をインクリメントするのに、cnt = cnt + 1 って書かないといけない。ちょっと面倒って思わないようにしよう。
最後に
今は基本を学習しているのだから for 文を使えと言われれば for 文を使うべきだと思う。この先、ここで学んだ基礎から応用問題へ発展していけるのだろう。
基礎がきちんとしていない家なんて、怖くて住めないでしょ?
心のどこかで、便利な関数あるんやから使えばええやん、って突っ込んでいる自分がいるけれど、何回も for 文を書いていくことで身についていっている実感はある。
引き続き、お付き合い、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません