LoginSignup
5
10

More than 1 year has passed since last update.

【チートシート】【Python】AtCoder(アルゴリズム)の問題を解く際に覚えておくべきメソッド一覧

Last updated at Posted at 2022-08-06

記事を書いた背景

AtCoderの問題を解くのが他の人と比べてなぜ遅いのか自分で考えた結果

  • AtCoder頻出のメソッドを知らなさすぎ
  • Python独自の記法にまだ慣れていない
  • Pythonの便利メソッドが全くわからない
  • 文法なんてその都度調べたらいいや、という甘えがあった

のではないかと思い、執筆に至りました。文法の復習も兼ねています

前提

  • コード例は全てPythonです
  • AtCoderに興味ない方でも文法チェックシートとしても利用できます

input

一つの文字列を標準入力

N = input()

一つの数字を標準入力

N = int(input())

二つ以上の文字列を標準入力

# algo rithm
N, M = map(str, input().split())
print(N) # algo
print(M) # rithm

二つの数字を標準入力

# 1 3
N, M = map(int, input().split())
print(N) # 1
print(M) # 3

標準入力(改行)

M = input()
N = input()

無数の数字を入力

# いくつ入力するかわからない場合はmap関数を使う
# set
N = set(map(int, input().strip().split()))
# tuple
N = tuple(map(int, input().strip().split()))
# list
N = list(map(int, input().strip().split()))

無数の文字を入力

# いくつ入力するかわからない場合はmap関数を使う
# set
N = set(map(str, input().strip().split()))
# tuple
N = tuple(map(str, input().strip().split()))
# list
N = list(map(str, input().strip().split()))

N個の要素を縦で入力

N = int(input())
# N個分の要素を入れることができる空のlistを用意
A = [""] * N
# 数字なら A = [0] * N
# N個分代入していく
for i in range(N):
    A[i] = input()

計算

整数値を求める

# 1 3 8
A, B, C = map(int, input().split())
# /だと4.0(double)になるが//だと4(int)になる
print((A+B+C)//3) # 3

複数の整数の最大値を求める

# 31 41 59 26
A, B, C, D = map(int, input().split()) 
print(max(A, B, C, D)) # 59

複数の整数の最小値を求める

# 31 41 59 26
A, B, C, D = map(int, input().split()) 
print(min(A, B, C, D)) # 26

割り算の商のみを抽出

print(17 // 4) # 4

過去問(abc239,B問題)

回答

X = int(input())
print(X // 10)

絶対値

print(abs(-10)) # 10

累乗

print(pow(4,3)) # 64

ルート

from math import sqrt

print(sqrt(2)) # 1.4142135623730951

進数

10進数を2進数、8進数、16進数へ

# 2進数
print(format(100, 'b')) # 1100100
# 8進数
print(format(100, 'o')) # 144
# 16進数
print(format(100,'x')) # 64

2進数、8進数、16進数を10進数へ

print(int("1010", 2))  # 10
print(int("172", 8))  # 122
print(int("4D2", 16))  # 1234

10進数からN進数

2,8以外の進数に変換する用の自作関数
2 <= N <= 9

def ten_to_n(num_10, num):
    if num >= 10 or num <= 1:
        return "numの引数は1以上9以下にしてください"
    # 後ろから値を桁を追加することを容易にするためにanswerをstringとして定義
    answer = ""
    # num_10がnumで割り切れなくなるまでひたすらwhile文を回す
    while num_10 >= num:
        if num_10 % num == 0:
            answer += "0"
        else:
            answer += str(num_10 % num)
        num_10 = num_10 // num
    answer += str(num_10)
    # 文字列answerを反転させる
    return answer[::-1]

print(ten_to_n(3429,3)) # 11201000

文字列

長さ

# S = "algo"
S = input
print(len(S)) # 4

文字列の中の特定の要素を出力

# S = "algo"
S = input() # 入力を文字列型として受け取る 
print(S[2]) # g

文字列を昇順に並び替える

algo = "algorithm"
print(''.join(sorted(algo))) #aghilmort

過去問(abc242,B問題)

回答

s = input()
print(''.join(sorted(s)))

文字列を降順に並び替える

algo = "algorithm"
print("".join(sorted(algo, reverse=True))) # tromlihga

文字列を反転させる

algo = "algorithm"
print(algo[::-1]) # mhtirogla

空白または文字列の先頭と末尾を削除する(strip)

algo = "  algorithm  "
print(algo.strip()) # "algorithm"
anaconda = "anaconda"
print(anaconda.strip("a")) # "nacond"
ran_word = "aaalambaaa"
print(ran_word.strip("a")) # "lamb"

空白または文字列の先頭を削除する(lstrip)

algo = "  algorithm  "
print(algo.lstrip()) # "algorithm  "
anaconda = "anaconda" 
print(anaconda.lstrip("a")) # "naconda"
ran_word = "aaalambaaa"
print(ran_word.lstrip("a")) # "lambaaa"

空白または文字列の末尾を削除する(rstrip)

algo = "  algorithm  "
print(algo.rstrip())
anaconda = "anaconda" # "  algorithm"
print(anaconda.rstrip("a")) 
ran_word = "aaalambaaa" # anacond
print(ran_word.rstrip("a")) # "aaalamb"

一つの文字列を別の文字列へ置き換える

date = "1982/07/06"
print(date.replace("/", "-")) # "1982-07-06"

文字列が含まれているか判定

print("algo" in "algorithm") # True
print("yama" in "river") # False

for

list内の数を足し算する

list = [10,20,30]
total = 0
# listの数だけitems変数に入れる
for items in list:
    total += items
print(total) # 60

range

N = 3
A = ["apple","banana","grape"]
text = ""
# 0からN-1までのループ
for i in range(N):
    text += A[i]
print(text) # applebananagrape

_(アンダーバー/アンダースコア)

変数を使わない際は_を使う

for _ in range(5):
  print("Atcoder")
# Atcoder
# Atcoder
# Atcoder
# Atcoder
# Atcoder

配列

要素数

A = ["apple", "banana", "grape"]
print(len(A)) # 3

文字列をlist化

S = turtle
S_list = list(S)
print(S_list) # ['t','u','r','t','l','e']

特定の区切り文字で文字列をlist化

S = 'one::two::three'
S_list = s.split('::')
print(S_list)
# ['one', 'two', 'three']

listを文字列に

S_list = ['t','u','r','t','l','e']
S = "".join(S_list)
print(S) # turtle

listの要素を後ろから指定

list = [1,2,3,4,5]
print(list[-1]) # 5
print(list[-4]) # 2

インデックスを指定して取り出す(スライス)

list[開始インデックス:終了インデックス]
と記載することで特定のインデックスの範囲内で配列を取り出すことができる

list = [1,2,3,4,5]
# 1以上、3未満のインデックスの配列を取り出す
print(list[1:3]) # [2, 3]
# 2以上のインデックスの配列を取り出す
print(list[2:]) # [3, 4, 5]
# 2未満のインデックスの配列を取り出す
print(list[:2]) # [1, 2]

listの末尾に要素を追加

list = [1,2,3,4]
list.append(5)
print(list) # [1, 2, 3, 4, 5]
algo = ["a", "l", "g", "o"]
algo.append("r")
print(algo) # ['a', 'l', 'g', 'o', 'r']

listの末尾に別のlistを結合

list = [1,2,3,4]
list.extend([5, 6, 7])
print(list) # [1, 2, 3, 4, 5, 6, 7]
algo = ["a", "l", "g", "o"]
algo.extend(["r", "i", "t", "h", "m"])
print(algo) # ['a', 'l', 'g', 'o', 'r', 'i', 't', 'h', 'm']

listの指定位置に要素を追加

list = [1, 2, 3, 4]
list.insert(2, 5)
print(list) # [1, 2, 5, 3, 4]
list.insert(-1, 6)
print(list) # [1, 2, 5, 3, 6, 4]
algo = ["a", "l", "g", "o"]
algo.insert(1, "r")
print(algo) # ['a', 'r', 'l', 'g', 'o']
algo.insert(-2, "i")
print(algo) # ['a', 'r', 'l', 'i', 'g', 'o']

list内の最大値

list = [1,2,3,4]
print(max(list)) # 4
alpha = ["Z", "A", "J", "W"]
print(max(alpha)) # Z

list内の最小値

list = [1,2,3,4]
print(min(list)) # 1
alpha = ["Z", "A", "J", "W"]
print(min(alpha)) # A

list内の数字を絶対値の降順に並び替える

list = [1,2,3,4]
list.reverse()
print(list) # [4,3,2,1]

list内の要素を取り出す(アンパック)

list = [1, 2, 3, 4, 5]
algo = ["a", "l", "g", "o"]
print(*list) # 1 2 3 4 5
print(*algo) # a l g o

list内の要素を昇順に並び替える

num = ["1", "3", "2", "5", "4"]
num.sort()
print(num) # ['1', '2', '3', '4', '5']
algo = ["a", "l", "g", "o", "r", "i", "t", "h", "m"]
algo.sort()
print(list) # ['a', 'g', 'h', 'i', 'l', 'm', 'o', 'r', 't']

list内のインデックスを取得

num = [1, 3, 2, 5, 4]
print(num.index(3)) # 1
algo = ["a", "l", "g", "o", "r", "i", "t", "h", "m"]
print(algo.index("r")) # 4

listの中に要素があるかどうか判定

num1 = [1, 3, 2, 5, 4]
num2 = {1, 3, 6}
for num in num2:
    if num in num1:
        print("Yes")
    else:
        print("No")
# Yes
# Yes
# No
algo1 = ["a", "l", "g", "o"]
algo2 = {"a", "r", "t"}
for algo in algo2:
    if algo in algo1:
        print("Yes")
    else:
        print("No")
# Yes
# No
# No

過去問(abc236,B問題)

回答

# コードを記載
N, M = map(int, input().split())
S = list(map(str, input().split()))
# Tをsetにして処理を高速化
T = set(map(str, input().split()))
for items in S:
    if items in T:
        print("Yes")
    else:
        print("No")

list内の要素を降順に並び替える

num = ["1", "3", "2", "5", "4"]
num.sort(reverse=True) 
print(num) # ['5', '4', '3', '2', '1']
algo = ["a", "l", "g", "o", "r", "i", "t", "h", "m"]
algo.sort(reverse=True)
print(list) # ['t', 'r', 'o', 'm', 'l', 'i', 'h', 'g', 'a']

list内の要素を反転させる(reversed)

num = [1, 3, 2, 5, 4]
num_rev = list(reversed(num))
print(num_rev) # [4, 5, 2, 3, 1]
algo = ["a", "l", "g", "o", "r", "i", "t", "h", "m"]
algo_rev = list(reversed(algo))
print(algo_rev)  # ['m', 'h', 't', 'i', 'r', 'o', 'g', 'l', 'a']

list内の重複をなくす(setにキャスト)

list = [1,4,1,2,2,1]
unique_list = set(list)
print(unique_list) # {1, 2, 4}

過去問(abc240,B問題)

回答

n = int(input())
print(len(set(map(int, input().split()))))

転置配列

L = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(list(zip(*L))) # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

dict(辞書型)

keyとvalueをfor文使って出力

fruit_dict = {1: "apple", 2: "banana", 3: "grape"}

# items()を使ってk,vにそれぞれkeyとvalueを代入
for k, v in fruit_dict.items():
    print(k)
    print(v)
# 1
# apple
# 2
# banana
# 3
# grape

要素を全て削除

fruit_dict = {1: "apple", 2: "banana", 3: "grape"}

fruit_dict.clear()
print(fruit_dict) # {}

指定した要素を削除

fruit_dict = {1: "apple", 2: "banana", 3: "grape"}

fruit_dict.pop("apple")
print(fruit_dict) # {2: "banana", 3: "grape"}

lambda

無名関数のこと。簡単な関数ならlambdaにすることでコード量を大幅に削減できる
関数を引数とするメソッドにlamdbaを指定すると便利

map

リストの各要素に対して関数を適用する

# map(lambda式,リスト)
num = [1, 2, 3, 4, 5]
print(list(map(lambda x: x**2, num))) # [1, 4, 9, 16, 25]

filter

条件を満たす要素を抽出する

# filter(lambda式,リスト)
print(list(filter(lambda x: x % 2 == 0, num))) # [2, 4]

まとめ

今後もアルゴリズムの勉強をするつもりなので問題を解いて新たにわかったメソッドなどがあれば逐一追記していく予定です

記事の紹介

VSCode内でAtCoderのワークフローを全て完結させることができますので余裕のある方はこちらも記事も参照していただけると幸いです

5
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10