金曜日、forとlist
「if文までできるようになったんだ」
「if文は「条件分岐」だよね!すごい!自分で新しい文法の勉強をするなんて、そんな人ほとんどいないよ」
ひまり先輩が私をべた褒めする件について。
「あっ、閃いた」
「はい、ひまちゃんアウト。ちょっとこっち来て」
哀先輩がひまり先輩を連れて、部室の後ろに行ってしまった。私も一緒に付いて行こうとしたら、哀先輩に止められた。二人でこそこそ話でもするのかな?
「ゆいちゃんがfor文までできるようになったら、もう問題解けるようになるよ!」
「でも、毎日新しいことを覚えてたら、前の方を忘れそうだけど」
「大丈夫だよ、だってあの分厚い入門書を自力で読んでるんだよ。こんなに熱心な人いないよ」
「まあ、やる気があるうちにたくさん進めておいた方がいいか」
...こそこそ話すといってもひまり先輩がアグレッシブなのでかなり目立つのだけど。わっ、こっちに帰ってきた。見てないふりしとこ。
「えー、協議の結果ゆいちゃんはfor文を修得する権利を得ました」
「えっと、話の流れが......?for文には権利が必要なんですか」
「必要ないです、ひまちゃんの思い付きです」
ないですよね、知ってました。
「ということで、今からゆいちゃんにfor文を教えたいと思います」
「「繰り返し」だね。例えば100回同じ処理を繰り返したいときとかに使う」
「とりあえず哀ちゃんがプログラムを書いてくれるから、それを読んでみて」
<<Python>>
for i in range(10):
print(i)
print文はいつものやつだね。実家のような安心感。iは文字列の""で囲まれてないから、文字じゃなくて、変数として出力するんだね。
変数なら、i = なんとか みたいなコードが上にあるはずだけど?その代わりに見知らぬfor i なるものがある。多分これが「繰り返し」に必要なコードなんだろうな。
「ゆいちゃん、for文がどんな意味か分かった?」
「あんまり... iが変数だということは分かりました」
「結構いい線行ってるよ! じゃあ実際に実行してみよう!」
<<Terminal>>
>python main.py
0
1
2
3
4
5
6
7
8
9
えっと。print文の中身が出力されてるから、つまり変数i は0から9まで増えていくってことかな。英語でも、forは「~の間」っていう意味だった。inは「~の中」で、rangeは「範囲」とかだったかな。範囲っていいながら range(10)だと、どこからどこまでって分からなくない?
ひまり先輩は私がモニターとにらめっこしている間に何か作りにいったみたい。部室は不運にも爆破してしまったので、ケーキ同好会として何か作りに行くときは毎回家庭科室まで行くことになったのだ。
哀先輩は私の方を見ながらニコニコしてる。そういえば、あんまり笑ってる顔見たことないから新鮮かも。いつもひまり先輩が起こした事件の後処理で疲れてるし。
「print文が10回繰り返されていることは分かった?」
「あれ、これ10回なんですか?9回だと思っていました」
「1から9までなら9回、0も数えると10回になる」
本当だ。つまり、range(10)というのは、0から10個進めたところまでの範囲なんだね。range(3)なら、0, 1, 2ってことか。
括弧の中に入れた数字には絶対ならないのが気持ち悪いけど、分かった気がする。
「変数iが0から9まで繰り返すってことですか?」
「そう。不等式で書くなら、0 <= i < 10 みたいに書くね」
「右の不等式にはイコールがつかないんですね」
「「半開区間」って言う。まあfor文を書くときのお約束みたいな感じ?でほかのプログラミング言語でもfor文は半開区間だね」
半開区間があるなら、全開区間とか、閉区間とかもあるのかな。ひまり先輩はいつもエンジン全開区間。ごめんなさい。
「for文ができると競プロの問題が解けるようになるよ。最近実際に出た問題だとこんな感じかな」
そのとき、哀先輩がふと思い出したかのように私の方を見た。
「あ、その前に配列を教えとかないといけないか」
「え、for文まででこの問題が解けるって」
「いや、Pythonは入力の受け取りがC++と違うから、ちょっと教えるの下手だった。ごめん」
<<Python>>
A = [3, 1, 4, 1, 5]
for i in range(5):
print(A[i])
<<Terminal>>
>python main.py
3
1
4
1
5
「変数を大量に持っておきたいときに、全部にa = ,b = , ...みたいに名前を付けるのは面倒だから、そういうときに配列を使う」
とりあえずprint文の中身を見る。[]っていう知らない記号がある。その中にさっきのfor文の変数iが入ってるね。だから、iは0から4まで増えるってことか。
つまり、print文は、A[0], A[1], A[2], A[3]の順に出力してるってこと。じゃあ、A[0]は、Aの1番目の値を表す名前なんだね。変数の名前に変数が使えるようになった感じかな?
......配列もfor文といっしょで、数字が0から始まるんだね。慣れないと間違えそう。
「じゃあ、気を取り直して問題をどうぞ」
<<問題>>
N人の子供たちが一列に並んでいます。前からi番目の子供の身長は A_i です。子供たちの中で一番身長が高い子供は前から何番目にいますか?
<制約>
入力はすべて整数である
1 <= N <= 100
1 <= A_i <= 200
A_i != A_j (i != j)
<入力形式>
N
A_1 A_2 ... A_N
<入力例>
3
100 80 120
<出力例>
3
「たくさん書いてありますね」
「問題が簡単なうちは、問題文と入出力例を見るといいよ。難しい問題になってくると、条件を加味したプログラムを書く必要があるから、制約も見る必要が出てくるけどね」
入力例を見る。最初の行に、子供たちの人数があって、次の行に子供たちの身長がスペース区切りであるんだね。
改行区切りならfor文で受け取れるけど、スペース区切りだと困っちゃうな。input()は改行まで読み込むから、x = int(input())が使えないね。......これどうすればいいんだろう。さすがに聞いた方がいいかな。
「入力をスペース区切りで受け取るのってどうすればいいですか?」
「さっき言った配列で受け取る必要があるから、A = input().split()だね。整数で受け取りたかったらlist(map(int,input().split()))」
「え、整数で受け取るときなんて言いました?」
「りすとまっぷいんといんぷっとすぷりっと、りすとまっぷいんといんぷっとすぷりっと、りすとまっぷいんといんぷっとすぷりっと」
「ふふっ、ゆっくり喋っても、括弧とか点の位置が分からないじゃないですか」
結局哀先輩が打ち込んでくれた。......哀先輩もふざけたりするんだね。意外かも。
前から身長を確認していって、一番大きい人を見つければいいんだよね。前から見るためには、for文を使ってやる。一番大きい人だから、身長を入れる変数heightを作って、i番目の人の身長A[i]の方が高かったら入れ替える、みたいにすればいいかな。「~なら」だから、昨日やったif文だね。
あとは、何番目の人が一番高いかを覚えておくだけだから、answerっていう変数の中に、一番大きな人のiを入れたら完成かな。あれ、でもこれだと一番最初の人が一番高かったら答えが0番目になっちゃうな。うん?
そうだ、for文の変数iは0から始まるんだった。だから、answerに入れるときは、answer = i + 1みたいに1足さないといけないね。よし、これで多分できた!
<<Python>>
N = int(input())
A = list(map(int,input().split()))
height = 0
answer = 0
for i in range(N):
if height < A[i]:
height = A[i]
answer = i + 1
print(answer)
「今ゆいちゃんがやったのは「全探索」って名前がついてる」
「あ、全部調べるから「全」探索ですか?」
「そう。競技プログラミングでは全探索が基本の考え方だから、ちゃんと身に着けてね」
ふう。今日はfor文と、配列もやったから内容多めだったな。忘れないうちにメモに書いとこ。
......何やら外が騒がしいけど、何かあったのかな。心配していると、ひまり先輩が部室の扉を勢いよく開けて入ってきた。
「見て!私が作ったガトーショコラ、天才的じゃない!?」
「ひまちゃん、部室に持ってこなくても私たちを家庭科室に呼べばいいんだよ」
「あ、そうか、でもすごくおいしいから早く食べよう!先行って待ってるから!」
そして颯爽と走り去るひまり先輩。皿の上のガトーショコラは大丈夫なんだろうか...
----------------------------------------------------------------------------------
まとめ
print("") で文字を出力する
x = で文字や数を記憶しておける(変数)
x = input() で文字を入力する
x = int(input()) で数を入力する
if 条件式: で条件を満たしたときだけ処理をすることができる(: ←コロンを忘れずに!)
else: をifの後ろに付けると、ifが実行されなかったときだけ処理をすることができる
追加
for i in range(N): で処理をN回繰り返すことができる(iは0から!)
A = [] で配列(変数がたくさんあるやつ)を作る
配列のi番目の値には、A[i]でアクセスする(0番目から!)
enumerateを使えと言われたら泣いちゃいます




