ABCのA問題・B問題対策(茶Coderを目指して)
ABCの問題を解くうえで知っておいた方がよい技法や知識をまとめておこう.(Python特有の内容が多めです.)
【補足】はA・B問題では不要のことが多いですが,参考までに記しています.
〇入力データの受け取り
自分のプログラムで,どのような形でデータを保存したいか考えて,適切な方法で読み取りましょう.(または,無難な方法で読み込んで,後で適切な形のデータに変換しましょう)
特に,2次元配列(リスト)の作り方は,B問題で必須.
〇数値演算
四則演算 +(加算),-(減算),*(乗算),/(除算.答えはfloat型)
整数除算 Pythonでは //.整数 // 整数 はint型
code: python
print(5 / 2, type(5 / 2)) # 2.5 <class 'float'>
print(5 // 2, type(5 // 2)) # 2 <class 'int'>
print(6 / 2, type(6 / 2)) # 3.0 <class 'float'> 割り切れても float型
print(5.5 // 2, type(5.5 // 2)) # 2.0 <class 'float'> 普通こんなことしないけど...
剰余算 Pythonでは %.割り算の余り.【補足】競プロでは意外によく使う.→ Mod(剰余算) 累乗 Pythonでは **,またはpow.【補足】powは第3引数で剰余算も併用できる
code: python
print(3 ** 3) # 27
print(pow(3, 3)) # 27
print(pow(3, 3, 10)) # 【補足】7 (= 27 % 10)
〇2進数⇔10進数変換
文字列の2進数 → 整数.Pythonでは,intの第2引数として2を指定する.
code: python
print(int('1010', 2)) # 10
整数→2進数表示.Pythonではf文字列のb(2進数)指定,またはbin()関数(文字列の先頭に0bが付く).
code: python
a = 10
print(f'{a:b}') # 1010
print(bin(a)) # 0b1010.binの返り値は文字列
〇リスト
0-index/1-index
PythonやC++では,リスト(配列)の添字は0から始まる.これを0-indexと呼ぶ.
アルゴリズムによっては,1から開始する方が都合が良い場合もある.これを1-indexと呼ぶ.
リストの結合
演算子 +で結合.*は同じリストを複数+するときに使う
code: python
スライス
リストの一部を切り出す.2番目の引数は含まないことに注意.
code: python
ソート
sorted(リスト) ・・・ソートした新しいリストを作る.元のリストは変更なし(非破壊).reverse=Trueで降順.
リスト.sort()・・・リスト自体をソートする.値の位置が変更される(破壊).reverse=Trueで降順.
code: python
a.sort(reverse=True) # リストaがソートされる.print(a.sort())とするとNoneと表示される
データの検索
in:リスト内にデータが存在するかの判定.$ O(N)(リストの長さ分の処理)が必要なので,Nが大きいときは要注意.inを高速で行いたいときは,後述の集合(set)や辞書(dict)を使う.
code: python
print(1 in a) # True
print(2 in a) # False
リストのどこに存在するかindexを知りたいときは,(A・B問題なら)素直にループを回して探す.
code: python
x = 3
for i in range(len(a)):
print(i) # 1 が表示されて
break # ループ終了
【補足】index:リストのどこに存在するかindexを返す.存在しないと Value Errorになるので注意.
code: python
print(a.index(1)) # 0. 複数存在するときは,最小indexを返す
print(a.index(1, 1)) # 第2引数は検索開始位置.1番目から検索するので,4となる
print(a.index(1, 1, 4)) # 第3引数は検索終了位置.1~3番目を検索.存在しないのでエラーになる.
〇文字列
基本(結合,スライス,ソート,ループ)
文字列は「文字」が集められたもの.文字列のまま,リストと同じような処理ができる.
code: python
print('apple' + 'pen') # appelpen.【補足】PyPyでは + による文字列結合は時間がかかるので注意
for c in 'pen': # 1文字ずつループ
print(c, end=', ') # p, e, n,
文字列のリスト化 読み込んだ文字列は変更不可能.変更したいときは,リストに変換する.
code: python
s = 'coffee'
print(s) # coffee.このまま s5 = 't' は実行不可能 s = list(s)
リスト化した文字列を復元したいときは,joinを使う
code: python
print(''.join(s)) # coffet
文字列の置換 replace.元の文字列は変更されない.
code: python
s = 'coffee'
print(s.replace('f', 'b')) # cobbee
print(s) # coffee
文字列の逆順.reversedより,スライス [::-1] が便利.
code: python
s = 'coffee'
print(reversed(s)) # <reversed object at 0x14f11f290130>
print(''.join(list(reversed(s)))) # eeffoc
文字列の検索.ループを回して探すか,findを使う.
code: python
s = 'coffee'
for i in range(len(s)):
print(i) # 2 が表示されて
break # ループ終了
print(s.find('f')) # 2 が表示される.上の処理が1行で済む.知っていると便利
print(s.rfind('f')) # 【補足】3 が表示される.右から検索する.
アルファベットの大文字/小文字の判定: isupper, islower.すべての文字が大文字/小文字かを判定
code: python
print('A'.isupper()) # True
print('ABC'.isupper()) # True
print('ABCd'.isupper()) # False
アルファベットの小文字化/大文字化:upper, lower.全ての文字を大文字/小文字化
code: python
print('a'.upper()) # A
print('Japan'.upper()) # JAPAN
【補足】アルファベットの全ての大文字/全ての小文字からなる文字列.stringモジュールのインポートが必要.
code: python
import string
print(string.ascii_uppercase) # ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase) # abcdefghijklmnopqrstuvwxyz
〇集合・辞書
リストでは対応できない/対応しにくい/計算時間がかかる/ときには,別のデータ構造を使う.