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