レッスン 23
レッスンの目標⌗
パイソンの基本を課題を通じて、練習しましょう
演習⌗
今まで学んだ基本的なpythonのプログラミングの仕組みを使って、実際に自分でプログラムを作ってみましょう。
情報オリンピック日本委員会作『日本情報オリンピック一次予選競技課題』から簡単な問題を出題しますので、挑戦してみましょう。
演習1(移動)⌗
A 地点から B 地点に移動するのに X 時間,B 地点から C 地点に移動するのに Y 時間かかる.
A 地点から B 地点を経由して C 地点に移動するとき,Z 時間 30 分以内に移動することができるか判定せよ.
ex01.py
という名前でプログラムを作成してください。
入力⌗
入力は以下の形式で与えられる.
X
Y
Z
入力される値はすべて整数である.
出力⌗
Z 時間 30 分以内に移動することができるならば 1 を,そうでない場合は 0 を出力せよ.
入力例1⌗
2
3
4
出力例1⌗
0
- A 地点から B 地点に移動するのに 2 時間,B 地点から C 地点に移動するのに 3 時間かかる.よって,A 地点から B 地点を経由して C 地点に移動するのに 5 時間かかる.
- 4 時間 30 分以内に移動することができないため,0 を出力する
入力例2⌗
3
4
10
出力例2⌗
1
- A 地点から B 地点を経由して C 地点に移動するのに 7 時間かかる.
- 10 時間 30 分以内に移動することができるため,1を出力する.
ヒント⌗
pythonでは整数と小数の値をそのまま足したり、比較したりできます。30分は0.5時間なのでZに0.5を足せば簡単に比較できます。
注意⌗
input()
で入力データを受け取る際、input()
の中に説明文を入れる必要はありません。入れると説明文が出力されてしまうので間違いと判定されてしまいます。
同様に、print()
で出力する際も値だけを出力するようにし、余計な説明文を出力してはいけません。
python3 ex01.py
でプログラムを実行したら、入力例の部分をコピーして、プログラムを実行しているコマンドラインに張り付けてください。結果が出力されます。出力結果が出力例通りになっているか確認してください。全ての出力例が正しければ、正解です。
演習2(2番目に大きい整数)⌗
3 つの整数 A,B,C が与えられる.これらのうち 2 番目に大きい数を出力せよ.
ex02.py
という名前でプログラムを作成してください。
入力⌗
入力は以下の形式で与えられる.
A B C
出力⌗
A,B,C のうち,2 番目に大きい数を出力せよ.
入出力例⌗
入力例1⌗
7 5 3
出力例1⌗
5
- 7,5,3 のうち,2 番目に大きい 5 を出力する.
入力例2⌗
1 3 3
出力例2⌗
3
- 与えられる整数のうち,2 つが等しい場合もある
- 1,3,3 を大きい順に並べると 3,3,1 であるので,2 番目に大きい 3 を出力する.
入力例3⌗
100 100 100
出力例3⌗
100
- 与えられる整数のすべてが等しい場合もある.
入力例4⌗
29 83 1
出力例4⌗
29
ヒント⌗
今回の入力のようにスペース(空白)で区切られた数値を受け取る場合
x = input()
のようにすると、x
には"1 2 3"
のようにスペースで区切られた全体の文字列が入力されます。これらの値を分割するには以下のようにsplit()
という組み込み関数
を使用します。
x = input().split(" ")
split()
という組み込み関数
は、引数で指定した文字列で文字列を分割してリストにしてくれます。
今回の入力データはスペースで区切られているので、スペースを表す" "
を引数として渡すと、戻り値のx
には、リストとしてそれぞれx[0], x[1], x[2]
に"1","2","3"
というスペースが削除された各文字列が格納されます。
格納されている値は文字列なので数値として使うためにはint(x[0])
のようにint()
という組み込み関数
を使って数値に変換する必要があります。
これらの変換をまとめて行うmap()
という組み込み関数
があります。この関数を使って以下のようにすると
A, B, C = map(int, input().split(" "))
入力されたスペースで区切られた3つの数字の文字列をそれぞれ数値に変換して、A, B, Cという3つの変数に、格納してくれます。
map()関数
の仕組みを理解するのはちょっと難しいので、ここでは詳しく説明しませんが、お決まりの仕組みとして覚えておきましょう。
なお、入力されるものが2個なら、変数も2個、入力されるものが4個なら変数も4個指定します。
演習3(複雑な文字列)⌗
長さ N の文字列 S が与えられる.S の各文字は A,B,C,D,E のいずれかである.
S に 3 種類以上の文字が出現する場合は Yes を,そうでない場合は No を出力せよ.
ex03.py
という名前でプログラムを作成してください。
入力⌗
入力は以下の形式で与えられる.
N
S
- N は整数である.
- S は長さ N の文字列である.
- S の各文字は A,B,C,D,E のいずれかである.
出力⌗
S に 3 種類以上の文字が出現する場合は Yes を,そうでない場合は No を出力せよ.
入力例1⌗
4
BABE
出力例1⌗
Yes
出現する文字は A,B,E の 3 種類である.3 種類以上の文字が出現するため,Yes を出力する.
入力例2⌗
3
DAD
出力例2⌗
No
出現する文字は A,D の 2 種類である.3 種類以上の文字が出現しないため,No を出力する.
入力例3⌗
5
BACED
出力例3⌗
Yes
入力例4⌗
28
EEEEEEEEEEEEEEEEEEEEEEEEEEEE
出力例4⌗
No
ヒント1⌗
文字列s
から1文字ずつ文字を取り出すには、s[0], s[1]...s[N-1]
のように文字列の何番目という値を[]
の中に指定することで1文字ずつ取り出すことができます。
0から始まるので、文字列の長さがNの場合、0からN-1までとなります。
以下のような繰り返しを使用すれば、順番に1文字ずつ文字を取り出すことができます。
for i in N:
x = s[i]
...
上記例では、sから順番に取り出した文字が1文字ずつx変数
に入れられます。
ヒント2⌗
この問題を解くには、辞書を使う方法が考えられます。
出現した文字の数をcnt
という変数にして、0で値を初期化しておきます。
次に、以下のようにすると、あらかじめ A,B,C,D,Eの文字に対して、出現した数の初期値0を登録した辞書を作成することができます。
d = {"A":0, "B":0, "C":0, "D":0, "E":0}
次に、各文字ごとにその文字を辞書から参照し、
- 値が
0
だったら初めて出現する文字なので、出現した文字の数cnt
を1つ増やします。その際、この文字の辞書の値も1つ増やします。 - 辞書から参照した値が
1以上
だったら、既に出現した文字なので、出現した文字の数cnt
は変更せず、この文字の辞書の値だけ1つ増やします。
ここで、もとの値に対し、値を1つ増やすには以下のような書き方があります。
cnt += 1
1の部分を好きな数に書き変えれば、好きな数だけ増やすことができます。
全文字の処理が終わったらcnt
に使用した文字の数が入っているので3以上かどうかを判断して回答します。
別なやり方として、以下の辞書に既に登録されているか否かという仕組みを利用する方法も考えられます。
if name in age:
# 登録されている処理
else:
# 登録されていなかった処理
この仕組みを使うと、空の辞書だけ作成しておいて
- 辞書に文字が登録されていれば、既に出現した文字なので変数
cnt
は変更せず、その文字の辞書の値を1つ増やす。 - 辞書に文字が登録されていなければ、初めて出現する文字なので、変数
cnt
を1つ増やし、その文字を値を1として辞書に登録する。
という処理を行うことで、同様の結果を得ることができます。
演習4(3 つの整数)⌗
3 つの整数 A,B,C が与えられる.A,B,C はそれぞれ 1 または 2 である.1 と 2 のうち,どちらが多くあるか.
ex04.py
という名前でプログラムを作成してください。
入力⌗
入力は以下の形式で与えられる.
A B C
- A,B,C はそれぞれ 1 または 2 である.
出力⌗
1 と 2 のうち,個数が多い方を出力せよ.
入出力例⌗
入力例1⌗
1 2 1
出力例1⌗
1
- 1 が 2 個で 2 が 1 個なので,個数の多い 1 を出力する.
入力例2⌗
2 2 2
出力例2⌗
2
- すべて 2 なので,2 を出力する