AtCoder_Python3

入力を受け取る

入力が
入力
の場合、
変数 = int(input())
変数 = int(input().strip())
入力が
入力 入力
の場合、
変数, 変数 = map(int, input().split())
入力が
入力 入力 入力 入力
入力 入力 入力 入力
入力 入力 入力 入力
入力 入力 入力 入力
の場合、
リスト名 = [input().split() for _ in range(4)]

出力

print(出力文)

計算

引き算
変数 = 変数 - 変数
除算(小数で返ってくる)
変数 = 変数 / 変数
床除算(小数点以下を切り捨てて整数部分だけを返す)
変数 = 変数 // 整数

if文


				if 条件文:
				    処理
				elif 条件文:
				    処理
				else:
				    処理
				

条件

変数が100より小さい場合True
変数 < 100
変数が100以上かつ5000以下の場合True
100 <= 変数 <= 5000

出力文

f"{}"
整数を2桁以内の十進数としてフォーマット(1桁の場合先頭に0を追加して2桁にする)
変数 = f"{変数:02d}"

リスト

リスト名 = [要素1, 要素2, …, 要素N]

rangeのfor文でリストを作る方法

リスト名 = [変数 for 変数 in range(初期値, 最終値-1, 等差値)]

リスト内包表記

12個の要素を持つリストを25個の要素として持つリストの場合
arr = [[0] * 12 for _ in range(25)]

リストの要素の入れ替え

リスト名[index番号1], リスト名[index番号2] = リスト名[index番号2], リスト名[index番号1]

タプル

(要素1, 要素2, …, 要素N)

スペースで区切った文字列をリストに変換

リスト名 = "N NNE … NNW".split()
リスト内容
['N', 'NNE', …, 'NNW']

大きい方を出力する

xとyは数値とした場合、大きい方が出力される
print(max(x, y))

文字列を複数文字変換

text.translate()とstr.maketrans()を使用する
文字列.translate(str.maketrans('変換前の文字', '変換後の文字', '文字列から削除したい文字'))

整数の階乗

math.factorial()を使用する

				import math
				math.factorial(整数)
				

n個の中からm個を選ぶ方法の数(nCm)

nとmは整数とし、階乗を使用する
nCm = nPm / m! (nPmはn個からm個を並べる(順列))
nPm = n! / (n-m)! (順列の公式)
nCm = (n! / (n-m)!) / m! (代入)
nCm = n! / (m! * (n-m)!) ((n-m)!を分母分子にかける)
組み合わせの計算では結果が整数になるが浮動小数点数にならないように、"/"ではなく、"//"を使用する

				def comb(n, m):
					if n < m:
						return 0
					return math.factorial(n) // (math.factorial(m) * math.factorial(n - m))
				

n個の中からm個を選びその後残りの(n-m)個からl個を選ぶ組み合わせの数

n個の中からm個を選ぶ方法の数(nCm)のプログラムを使用する。

				def calc_combinations(n, m, l):
    				return comb(n, m) * comb(n - m, l)
				

時間を5分単位で丸める

1148(11時48分の場合)(切り捨て)

                time = 1148
                print("{0:02d}:{1:02d}".format((time // 100), (time % 100 - (time % 5))))
			    # 出力  11:45
                
1148(11時48分の場合)(切り上げ)

                time = 1148
                print("{0:02d}:{1:02d}".format((time // 100), (time % 100 + (5 - time % 5) % 5)))
			    # 出力  11:50
                

時間を分にする

1148(11時48分の場合)

                time = 1148
                print((time // 100) * 60 + time % 100)
			    # 出力  708
                

範囲が重なる部分を統合

0~6 2~7 1~5 3~4 0~6 8~9 を入力 0~7 8~9 が出力されてほしい場合

                arr = [0] * 10 # 範囲としてある数(0~9)
                for _ in range(入力の数):
                    start, end = map(int, input().split("~"))
                    arr[start] += 1
                    arr[end] -= 1
                started = False
                score = 0
                for i in range(0, len(arr)):
                    score += arr[i]
                    if score >= 1 and not started:
                        first = i
                        started = True
                    if score == 0 and started:
                        end = i
                        started = False
                        print("{0}~{1}".format(first, end))
                # 出力
                # 0~7
                # 8~9
                

三角形の面積を求める(3頂点の座標だけがわかる場合)

A=(xa,ya)、B=(xb,yb)、C=(xc,yc)で、入力はxa,ya,xb,yb,xc,ycとする。
まず、Aを原点とした三角形にするため、xb-xa=x1、yb-ya=y1、xc-xa=x2、yc-ya=y2とする。
「頂点Cのy軸」と「直線AB」の交点を点Pとする。
直線CPを底辺とすると、この三角形の面積は、底辺×高さ1×(1/2)+底辺×高さ2×(1/2)となる。
式を変形すると底辺×(1/2)×(高さ1+高さ2)、高さ1+高さ2=x1なので、底辺×(1/2)×x1
底辺を求めるために点Pのy座標を求める。
点Pは、直線ABのx座標がx2の位置であるから、点Pのy座標=y1/x1×x2
底辺=y2-y1/x1×x2、三角形の面積=(y2-y1/x1×x2)×(1/2)×x2=(x1×y2-x2×y1)×(1/2)

                def calculate_triangle_area(a, b, c, d, e, f):
                    x1, y1 = c - a, d - b # Aを原点とした場合のB
                    x2, y2 = e - a, f - b # Aを原点とした場合のC
                    return abs(x1 * y2 - x2 * y1) / 2
                a, b, c, d, e, f = map(int, input().split())
                area = calculate_triangle_area(a, b, c, d, e, f)
                print(area)
                

与えられたグラフの最大クリーク(完全部分グラフ)のサイズを見つける

Nはノードの数、Mはエッジの数とする。
edgesはエッジの集合で、各エッジはタプル(x, y)で表すとする。
N M
x1 y1
x2 y2
:
xM yM

				# 入力の読み取り
				N, M = map(int, input().split())
				edges = {tuple(map(int, input().split())) for _ in range(M)}
                
itertools.combinations()でリストなどからすべての組み合わせを生成できる。
sizeはクリーク(完全部分グラフ)のサイズを表す。
comboはsize個のノードの組み合わせである。
all((min(x, y), max(x, y)) in edges for x, y in c(combo, 2))は、combo内のすべてのノードペア(x, y)がエッジ集合edgesに存在するかをチェックする。
もしcomboが完全グラフ(クリーク)であれば、foundをTrueに設定し、ループを抜けます。
1つでも完全グラフ(クリーク)があれば、そのsizeの完全グラフ(クリーク)があることがわかるため、breakで抜けて計算を省く。
もしfoundがFalseのままであれば、最大クリークのサイズはsize-1であり、それを出力してループを終了する。

				# クリークのサイズを見つけるループ
				from itertools import combinations as c
				for size in range(1, n + 2):
				found = False
				for combo in c(range(1, n + 1), size):
					if all((min(a, b), max(a, b)) in edges for a, b in c(combo, 2)):
						found = True
						break
				if not found:
					print(size - 1)
					break				
                

同じ要素数を持つ複数のリストにfor文を使用する

同じ要素数を持つ複数のリストがある場合、for文を使用できる。
for文で取り出す要素は、リストの同じインデックスの要素となる。
zipを使用する。

				for リスト1の要素, リスト2の要素 in zip(リスト1, リスト2):
					処理
                

文字列に文字列が含まれるか調べる

文字列にその文字列に含まれるか調べたい文字列が含まれるなら、TrueをそうでなければFalseを返す。

				"文字列に含まれるか調べたい文字列" in "文字列"