はじめに
Pythonのスキルを身に付けるために AtCoder で 競技プログラミング を始めました。AtCoderでは初心者のために、AtCoder Beginner Contest(以下ABC)というコンテストを開催しています。コンテストでは、難易度に応じてA問題からD問題まで問題が用意されています。概ねA問題とB問題はPythonの実装方法を知っていれば解ける問題が多いです。A問題とB問題が解けるようになるために、本記事で実装方法を整理しました。
本記事について
本記事についてご説明します。
目的
本記事の目的は下記です。
- Python3でABC-A問題とABC-B問題を概ね解けるようになる
注意事項
本記事の注意事項は下記の通りです。ご理解の程をよろしくお願い致します。
- 本記事は一個人で作成した記事であり、AtCoder社は作成に一切関与していません
- ABC-A問題とABC-B問題をすべて解けるようになる訳ではありません
- Python3の一部マイナーバージョンで本記事とは異なる仕様があります
- 体系的なPython3を学習する記事ではありません
構成
各章は下記の構成です。
章
章名
内容
第1章
文法
文法を学べる
第2章
データ型
データ型を学べる
第3章
基本処理
基本処理(よく使われる関数とメソッド)を学べる
付録
-
Python3の学習を深める情報を学べる
各節項は下記の構成です。
項目
内容
サンプルコード
問題から得られた知見と検証によって得られた知見を整理したコード
入力
サンプルコードの入力例
実行結果
サンプルコードの実行結果
解答例
AtCoderに提出したACのコード
バージョン / 言語
サンプルコードは下記バージョンで動作することを確認しています。
$ python --version
Python 3.6.4
解答例はAtCoderの下記言語でACになることを確認しています。
Python3 (3.4.3)
最後に
最後となりましたが、読者の方におかれましてはPython使いの成長過程と思い、温かく見守って頂けると幸いです。また、このような学習環境を提供して頂いている AtCoder社、SNS等で関わって頂いている競プロerの方に感謝を申し上げます。
第1章 文法
第1章では文法について説明します。
1.1 出力処理
キーポイント
- 標準出力は
print関数で出力する - 整数の出力は
print(整数値)で出力する - 変数の出力は
print(変数名)で出力する - 文字列の出力は
print("文字列")で出力する - 文字列の出力/定義は文字列をダブルクォーテーション
"、またはシングルクォーテーション'で囲う - print関数の区切り文字は
print(出力データ,sep="区切り文字")で指定する - print関数の区切り文字を指定しない場合
print(出力データ)、区切り文字は 半角スペース となる - print関数の末尾の文字は
print(出力データ,end="末尾の文字")で指定する - print関数の末尾の文字を指定しない場合
print(出力データ)、末尾の文字は 改行 となる
整数
- 整数を出力する
整数を出力する場合、print(整数値)で出力する。
print(10)
10
- 整数を変数に格納して出力する
整数を変数に格納して出力する場合、変数名=整数で変数を定義し、print(変数名)で出力する。
x=20
print(x)
20
浮動小数点数
- 浮動小数点数を出力する
浮動小数点数を出力する場合、print(浮動小数点数)で出力する。
print(2.9)
2.9
- 浮動小数点数を変数に格納して出力する
浮動小数点数を変数に格納して出力する場合、変数名=浮動小数点数で変数を定義し、print(変数名)で出力する。
x=3.5
print(x)
3.5
文字列
文字列の出力/定義は文字列をダブルクォーテーション"、またはシングルクォーテーション'で囲う。
- 文字列を出力する
文字列を出力する場合、print("文字列") または print('文字列') で出力する。
print("Hello World!")
Hello World!
- 文字列を変数に格納して出力する
文字列を変数に格納して出力する場合、変数名="文字列"で変数を定義し、print(変数名)で出力する。
s="Hello World!"
print(s)
Hello World!
- 文字列の変数のインデックスを指定して文字を出力する
文字列の変数のインデックスを指定して文字を出力する場合、print(変数名[インデックス数])で出力する。
s="Hello World!"
print(s[0])
H
s="Hello World!"
print(s[11])
!
リスト
- 1次元リストを出力する
1次元リストを出力する場合、print(リスト名)で出力する。
Lists=[1,2,3,4,5]
print(List)
[1, 2, 3, 4, 5]
- 1次元リストの各要素を出力する
1次元リストの各要素を出力する場合、for 変数名 in リスト名:でループ処理し、print(変数)で出力する。
Lists=[1,2,3,4,5]
for List in Lists:
print(List)
1
2
3
4
5
1次元リストをアンパックを使用して出力する場合、print(*リスト名)で出力する。
Lists=[1,2,3,4,5]
print(*List)
1 2 3 4 5
- 1次元リストのインデックス指定して各要素を出力する
1次元リストのインデックス指定して各要素を出力する場合、for 変数名 in range(リストの長さ):でループ処理し、print(リスト名[変数名])で出力する。
List=[1,2,3,4,5]
for i in range(len(List)):
print(List[i])
1
2
3
4
5
- 2次元リストを出力する
2次元リストを出力する場合、print(リスト名)で出力する。
List=[[1,2,3],[4,5,6]]
print(List)
[[1, 2, 3], [4, 5, 6]]
- 2次元リストの各行を出力する
2次元リストの各行を出力する場合、for 1次元リスト名 in 2次元リスト名:でループ処理し、print(1次元リスト名)で出力する。
Lists=[[1,2,3],[4,5,6]]
for List in Lists:
print(List)
[1, 2, 3]
[4, 5, 6]
- 2次元リストの各要素を出力する
2次元リストの各要素を出力する場合、for 1次元リスト名 in 2次元リスト名:でループ処理し、さらにfor 変数名 in 1次元リスト名:でネストし、print(変数名)で出力する。
List=[[1,2,3],[4,5,6]]
for Row in List:
for Col in Row:
print(Col)
1
2
3
4
5
6
- 2次元リストの各要素をインデックス指定して出力する
2次元リストの各要素をインデックス指定して出力する場合、for 変数名A in range(2次元リストの長さ):でループ処理し、さらにfor 変数名B in range(1次元リストの長さ):でネストし、print(リスト名[変数名A][変数名B])で出力する。
List=[[1,2,3],[4,5,6]]
for i in range(len(List)):
for j in range(len(List[i])):
print(List[i][j])
1
2
3
4
5
6
区切り文字の指定
print関数の区切り文字はprint(出力データ,sep="区切り文字")で指定する。
- 区切り文字を指定しない
区切り文字を指定しない場合print(出力データ)、区切り文字が 半角スペースで出力される。
a=1
b=2
c=3
print(a,b,c)
1 2 3
- 改行を指定する
改行\nを指定する場合、print(出力データ,sep='\n')で出力する。
a=1
b=2
c=3
print(a,b,c,sep='\n')
1
2
3
- カンマを指定する
カンマ,を指定する場合、print(出力データ,sep=',')で出力する。
a=1
b=2
c=3
print(a,b,c,sep=',')
1,2,3
- 区切り文字なしを指定する
区切り文字なしを指定する場合、print(出力データ,sep='')で出力する。
a=1
b=2
c=3
print(a,b,c,sep='')
123
末尾文字の指定
print関数の末尾の文字はprint(出力データ,end="末尾の文字")で指定する。
- 末尾文字を指定しない
末尾文字を指定しない場合print(出力データ)、末尾文字が 改行\nで出力される。
print("a")
print("b")
a
b
- 末尾文字なしを指定する
末尾文字なしを指定する場合、print(出力データ,end="")で出力する。
print("a",end="")
print("b")
ab
1.2 入力処理
キーポイント
- 標準入力は
input関数で入力する(文字列(str)型で入力される) - 標準入力から整数を得たい場合、整数(int)型
int(input())に変換する - 標準入力から浮動小数点数を得たい場合、浮動小数点数(float)型
float(input())に変換する - 標準入力から得た文字列を区切りたい場合、split関数を用いて
input().split("区切り文字")と使用する - split関数で区切り文字を指定しない場合
input().split()、半角スペース で区切られる - 複数列の整数の標準入力を複数の変数に格納したい場合、map関数を用いて
map(int,input().split())と使用する - 複数列の整数の標準入力をリストに格納したい場合、map関数を用いて
list(map(int,input().split()))と使用する - 複数行の整数の標準入力をリストに格納したい場合、リスト内包表記で
[int(input()) for 変数名 in range(入力行数)]と使用する
1行 / 1列
- 整数を変数に格納する
整数を変数に格納する場合、変数名=int(input())で格納する。
2
N=int(input())
print(N)
2
- 文字列を1つの変数に格納する
文字列を1つの変数に格納する場合、変数名=input()で格納する。
Hello world!
s=input()
print(s)
Hello world!
- 文字列を複数の変数に格納する
文字列を複数の変数に格納する場合、変数名A,変数名B,変数名C,変数名D=input()で格納する。
1234
a,b,c,d=input() # 1234を整数(int)型ではなく、文字列(str)型で変数に格納する
print(a,b,c,d)
1 2 3 4
hoge
a,b,c,d=input()
print(a,b,c,d)
h o g e
1行 / C列
- 整数を複数の変数に格納する
整数を複数の変数に格納する場合、変数名A,変数名B=map(int,input().split())で格納する。
1 2
a,b=map(int,input().split())
print(a)
print(b)
1
2
a,b=map(int,input().split())
print(b,a)
- 文字列を複数の変数に格納する
文字列を複数の変数に格納する場合、変数名A,変数名B=input().split()で格納する。
Hello world!
a,b=input().split()
print(a)
print(b)
Hello
world!
a,b=input().split()
print(b,a)
a,b,c=input().split(",")
print(a,b,c)
- リストに整数を格納する
リストに整数を格納する場合、リスト名=list(map(int,input().split()))で格納する。
1 2 3 4 5
List=list(map(int,input().split()))
print(List)
[1, 2, 3, 4, 5]
リストに整数を格納する場合、リスト名=[int(変数名) for 変数名 in input().split()]で格納する。
1 2 3 4 5
List=[int(i) for i in input().split()]
print(List)
[1, 2, 3, 4, 5]
- リストに文字列を格納する
リストに文字列を格納する場合、リスト名=list(input().split())で格納する。
Hello world !
List=list(input().split())
print(List)
['Hello', 'world', '!']
リストに文字列を格納する場合、リスト名=[変数名 for 変数名 in input().split()]で格納する。
Hello world !
List=[i for i in input().split()]
print(List)
['Hello', 'world', '!']
R行 / 1列
- 整数を複数の変数に格納する
整数を複数の変数に格納する場合、変数名=int(input())を複数行で格納する。
1
2
a=int(input())
b=int(input())
print(a,b)
1 2
整数を複数の変数に格納する場合、変数名A,変数名B=[int(input()) for ダミー変数 in range(変数の数)]で格納する。
1
2
a,b=[int(input()) for i in range(2)]
print(a,b)
1 2
- リストに整数を格納する
リストに整数を格納する場合、リスト名=[int(input()) for ダミー変数 in range(変数の数)]で格納する。
1
2
3
4
5
List=[int(input()) for i in range(5)]
print(List)
[1, 2, 3, 4, 5]
- リストに文字列を格納する
リストに文字列を格納する場合、リスト名=[input() for ダミー変数 in range(変数の数)]で格納する。
a
b
c
d
e
List=[input() for i in range(5)]
print(List)
['a', 'b', 'c', 'd', 'e']
- 入力行数が指定され、リストに整数を格納する
入力行数(Row=5)が指定され、リストに整数を格納する場合、変数名=int(input())で行数を格納し、リスト名=[int(input()) for ダミー変数 in range(変数名)]でリストに格納する。
5
0
1
2
3
4
Row=int(input())
List=[int(input()) for i in range(Row)]
print(List)
[0, 1, 2, 3, 4]
- 入力行数が指定され、リストに文字列を格納する
入力行数(Row=5)が指定され、リストに文字列を格納する場合、変数名=int(input())で行数を格納し、リスト名=[input() for ダミー変数 in range(変数名)]でリストに格納する。
5
a
b
c
d
e
Row=int(input())
List=[input() for i in range(Row)]
print(List)
['a', 'b', 'c', 'd', 'e']
R行 / C列
- 整数を2次元リストに格納する
整数を2次元リストに格納する場合、リスト名=[list(map(int,input().split())) for ダミー変数 in range(入力行数)]となる。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
List=[list(map(int,input().split())) for i in range(3)]
print(List)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Row=int(input())
List=[list(map(int,input().split())) for i in range(Row)]
print(List)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
整数を2次元リストに格納する場合、リスト名=[[int(変数名) for 変数名 in input().split()] for ダミー変数 in range(入力行数)]となる。
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Row=int(input())
List=[[int(j) for j in input().split()] for i in range(Row)]
print(List)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
整数を2次元リストに格納する場合、リスト名=[]でリストを用意し、for ダミー変数 in range(入力行数):でループ処理し、リスト名.append(list(map(int,input().split())))となる。
3
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Row=int(input())
List=[]
for i in range(Row):
List.append(list(map(int,input().split())))
print(List)
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
- 整数と文字列を複数のリストに格納する
整数と文字列を複数のリストに格納する場合、リスト名=[]で複数のリストを用意し、for ダミー変数 in range(入力行数):でループ処理する。そのループ処理の中で変数名A,変数名B=input().split()で入力データを受け取り、リスト名.append(データ)でリストにデータを追加する。
3
0 a
1 b
2 c
Row=int(input())
Number=[]
Alphabet=[]
for i in range(Row):
n,a=input().split()
Number.append(int(n))
Alphabet.append(a)
print(Number)
print(Alphabet)
[0, 1, 2]
['a', 'b', 'c']
1.3 四則演算
キーポイント
- 各演算は下記表の演算子を使用する
- 除法の結果(商)は 浮動小数点数(float)型 となる
- 切り捨て除法の結果(商)は 整数(int)型 となる
演算子
記述例
意味
+
a+b
加法
-
a-b
減法
*
a*b
乗法
**
a**b
べき乗
/
a/b
除法
//
a//b
小数点切り捨て除法
%
a%b
剰余
加法
加法は+演算子を使用する。
- 整数を足す
print(1+2)
3
- 変数に格納する
x=2+3
print(x)
5
- 変数で足す
x=3
y=4
print(x+y)
7
減法
減法は-演算子を使用する。
- 整数を引く
print(2-1)
1
- 変数に格納する
x=4-2
print(x)
2
- 変数で引く
x=3
y=6
print(x-y)
-3
h1=int(input())
h2=int(input())
print(h1-h2)
n=int(input())
print(n-1)
乗法
乗法は*演算子を使用する。
- 整数で掛ける
print(3*2)
6
- 変数に格納する
x=4*3
print(x)
12
- 変数で掛ける
x=5
y=6
print(x*y)
30
n=int(input())
print(n*2)
n,m=map(int,input().split())
print((n-1)*(m-1))
a,b=map(int,input().split())
print(a*b-(a+b-1))
H,W=map(int,input().split())
h,w=map(int,input().split())
print((H-h)*(W-w))
べき乗 / 指数
べき乗は**演算子を使う。演算は整数**指数となる。
- 整数でべき乗する
print(2**3)
8
print(10**9+7)
1000000007
- 変数に格納する
x=3**2
print(x)
9
- 変数でべき乗する
x=4
y=2
print(x**y)
16
n=int(input())
print(10**n+7)
n=int(input())
a=int(input())
print(n**2-a)
べき根 / 平方根
べき根は**演算子を使い、整数**べき根となる。計算結果は 浮動小数点数 となる。
- 整数で平方根を取る
print(4**.5)
2.0
print(4**0.5)
2.0
print(4**(1/2))
2.0
- 変数に格納する
x=9**.5
print(x)
3.0
- 変数で平方根を取る
x=16
y=.5
print(x**y)
4.0
階乗
階乗はimport mathでmathライブラリをインポートし、math.factorial(整数)となる。
import math
print(math.factorial(5))
120
import math
n=int(input())
print(math.factorial(n)%(10**9+7))
除法
除法は/演算子を使用する。除法の結果(商)は 浮動小数点数(float)型 となる。
- 整数で割る
print(6/3)
2.0
- 変数に格納する
x=9/3
print(x)
3.0
- 変数で割る
x=12
y=3
print(x/y)
4.0
ABC117 A - Entrance Examination
t,x=map(int,input().split())
print(t/x)
小数点切り捨て
小数点切り捨て除法は//演算子を使用する。除法の結果(商)は 整数(int)型 となる。
print(5//3)
1
x,y=map(int,input().split())
print(y//x)
n=int(input())
print(n//3)
x,y=map(int,input().split())
print(x+y//2)
a,b,c=map(int,input().split())
print(a*b//2)
小数点切り上げ
小数点切り上げ除法は//演算子を使用する。-(-割られる数//割る数)で小数点切り上げ除法となる。
print(-(-5//3))
2
n=int(input())
print(-(-n//2))
a,b=map(int,input().split())
print(-(-b//a))
a,b=map(int,input().split())
print(-(-(a+b)//2))
剰余
剰余は%演算子を使用する。
print(7%3)
1
n=int(input())
print(n%12+1)
a,b=map(int,input().split())
print((a+b)%24)
x,a,b=[int(input()) for i in range(3)]
print((x-a)%b)
a,b,c=map(int,input().split())
print(a*b*c%(10**9+7))
1.4 比較演算
比較演算は下記の表の通りとなる。
演算子
記述例
意味
==
a==b
aがbと等しい
!=
a!=b
aがbと異なる
>
a>b
aがbより大きい
>=
a>=b
aがb以上
<
a<b
aがbより小さい
<=
a<=b
aがb以下
in
a in b
aがbに含まれる
not in
a not in b
aがbに含まれない
1.5 論理演算
論理演算は下記の表の通りとなる。
演算子
記述例
意味
and
a and b
aもbも真であれば真
or
a or b
aまたはbが真であれば真
not
not a
aが偽であれば真
1.6 条件文
キーポイント
- 条件式は
if/elif/else文を使用する - 特定の文字列、整数が含まれているか判定する場合は
if/in文を使用する - 条件式を三項演算で記述する場合、
print(条件式がTRUEの処理 if 条件式 else 条件式がFALSEの処理)となる - 2つの条件式を三項演算で記述する場合、
print(条件式AがTRUEの処理 if 条件式A else 条件式AがFALSEかつ条件式BがTRUEの処理 if 条件式B else 条件式AがFALSEかつ条件式BがFALSEの処理)となる
基本文法
if/elif/else文
if/elif/else文はif 条件式:で条件文を書く。条件文がTRUEの場合、条件文の中の処理がされる。条件式が2つ以上ある場合、elif 条件式:で条件文を書く。どの条件式にも当てはまらない場合、else:文の処理がされる。
a=1
if a==1:
print("a is 1")
elif a==2:
print("a is 2")
else:
print("a is not 1 and 2")
a is 1
a=2
if a==1:
print("a is 1")
elif a==2:
print("a is 2")
else:
print("a is not 1 and 2")
a is 2
a=3
if a==1:
print("a is 1")
elif a==2:
print("a is 2")
else:
print("a is not 1 and 2")
a is not 1 and 2
q=int(input())
if q==1:
print("ABC")
else:
print("chokudai")
n=int(input())
if n<60:
print("Bad")
elif n<90:
print("Good")
elif n<100:
print("Great")
else:
print("Perfect")
y=int(input())
if y%4==0 and y%100!=0 or y%400==0:
print("YES")
else:
print("NO")
if/in文
特定の文字列、整数が含まれているか判定する場合、if/in文を使用する。if 探すデータ in 探されるデータとなる。
String="Hello world!"
if "e" in String:
print("e include")
else:
print("e don't include")
e include
String="Hello world!"
if "Hello" in String:
print("Hello include")
else:
print("Hello don't include")
Hello include
String="Hello world!"
if "Good" in String:
print("Good include")
else:
print("Good don't include")
Good don't include
List=["a","b","c"]
if "a" in List:
print("a include")
else:
print("a don't include")
a include
List=["a","b","c"]
if "ab" in List:
print("ab include")
else:
print("ab don't include")
ab don't include
List=[0,1,2]
if 1 in List:
print("1 include")
else:
print("1 don't include")
1 include
ABC049 A - 居合を終え、青い絵を覆う / UOIAUAI
c=input()
if c in "aiueo":
print("vowel")
else:
print("consonant")
n=input()
if "9" in n:
print("Yes")
else:
print("No")
x=input()
if x in "753":
print("YES")
else:
print("NO")
三項演算
ABC-A問題、ABC-B問題では簡易な条件式が多いため、三項演算を使うことが多い。
if/else文
条件式を三項演算で記述する場合、print(条件式がTRUEの処理 if 条件式 else 条件式がFALSEの処理)となる。
a=1
print("a is 1" if a==1 else "a is not 1")
a is 1
a=2
print("a is 1" if a==1 else "a is not 1")
a is not 1
2つの条件式を三項演算で記述する場合、print(条件式AがTRUEの処理 if 条件式A else 条件式AがFALSEかつ条件式BがTRUEの処理 if 条件式B else 条件式AがFALSEかつ条件式BがFALSEの処理)となる。
a=3
print("a is 1" if a==1 else "a is 2" if a==2 else "a is 3" if a==3 else "other")
a is 3
a=4
print("a is 1" if a==1 else "a is 2" if a==2 else "a is 3" if a==3 else "other")
other
q=int(input())
print("ABC" if q==1 else "chokudai")
n=int(input())
print("Bad" if n<60 else "Good" if n<90 else "Great" if n<100 else "Perfect")
x,y=map(int,input().split())
print("Better" if x<y else "Worse")
x=int(input())
print("ABC" if x<1200 else "ARC")
a,b,c=map(int,input().split())
print(a if b==c else b if a==c else c)
a,b,c,d=map(int,input().split())
print("Left" if a+b>c+d else "Balanced" if a+b==c+d else "Right")
a,b,c=map(int,input().split())
print("Yes" if a+b>=c else "No")
a,b,x=map(int,input().split())
print("YES" if a<=x and x<=a+b else "NO")
a,b=map(int,input().split())
print(a-1 if a>b else a)
n=int(input())
print("ABC" if n<1000 else "ABD")
r=int(input())
print("ABC" if r<1200 else "ARC" if r<2800 else "AGC")
b=input()
print("A" if b=="T" else "T" if b=="A" else "G" if b=="C" else "C")
a,b=map(int,input().split())
c,d=map(int,input().split())
print("YES" if a==c or a==d or b==c or b==d else "NO")
a=int(input())
b=int(input())
print("GREATER" if a>b else "LESS" if a<b else "EQUAL")
y=int(input())
print("YES" if y%4==0 and y%100!=0 or y%400==0 else "NO")
if/in文
if/in文を三項演算で記述する場合、条件式を探すデータ in 探されるデータで書き、print(条件式がTRUEの処理 if 条件式 else 条件式がFALSEの処理)となる。
String="Hello world!"
print("e include" if "e" in String else "e don't include")
e include
String="Hello world!"
print("Hello include" if "Hello" in String else "Hello don't include")
Hello include
String="Hello world!"
print("Good don't include" if "Good" not in String else "Good include")
Good don't include
List=["a","b","c"]
print("a include" if "a" in List else "a don't include")
a include
List=["a","b","c"]
print("ab include" if "ab" in List else "ab don't include")
ab don't include
List=[0,1,2]
print("1 include" if 0 in List else "1 don't include")
1 include
n=input()
print("YES" if n in "369" else "NO")
ABC049 A - 居合を終え、青い絵を覆う / UOIAUAI
c=input()
print("vowel" if c in "aiueo" else "consonant")
n=input()
print("Yes" if "9" in n else "No")
x=input()
print("YES" if x in "753" else "NO")
複数条件式
条件式を複数組み合わせることができる。
a=1
b=1
c=1
print("TRUE" if a==b==c else "FALSE")
TRUE
a=1
b=1
c=1
d=1
print("TRUE" if a==b==c==d else "FALSE")
TRUE
a=1
b=2
c=3
d=4
print("TRUE" if a<b<c<d else "FALSE")
TRUE
ABC061 A - Between Two Integers
a,b,c=map(int,input().split())
print("Yes" if a<=c<=b else "No")
a,b,c,d=input()
print("Yes" if a==b==c or b==c==d else "No")
a,b,c,d=input()
print("Yes" if a==b==c or b==c==d else "No")
a,b,x=map(int,input().split())
print("YES" if a<=x<=a+b else "NO")
a,b,x=map(int,input().split())
print("YES" if 0<=x-a<=b else "NO")
1.7 繰り返し文
キーポイント
- 繰り返しは
for文とwhlle文がある - for文は
for 変数 in range(初期値,終了値):となる、初期値を指定しない場合、0から始まる - while文は
while 条件式:となる、条件式がTRUEの場合、繰り返しを続ける
for文
for文はfor 変数 in range(初期値,終了値):となる。初期値を指定しない場合、0から始まる。
for i in range(5):
print(i)
0
1
2
3
4
for i in range(2,5):
print(i)
2
3
4
while文
while文はwhile 条件式:となる。条件式がTRUEの場合、while文の中の処理を続ける。
i=0
while i<5:
print(i)
i=i+1
0
1
2
3
4
第2章 データ型
第2章ではデータ型について説明します。
2.1 整数(int)
キーポイント
- 整数(int)型の宣言は
int(データ)となる - 浮動小数点数型を整数型に変換した場合、小数点が切り落とされる
print(int(2.9))
2
x=3.9
print(int(x))
3
x=int(input())
print(int(x**.25))
n=int(input())
print(int(n**.5)**2)
2.2 文字列(str)
キーポイント
- 文字列の定義は文字列をダブルクォーテーション
"、またはシングルクォーテーション'で囲う - 文字列の結合は
+演算子を使用する - 文字列の参照は
文字列[参照番号]となる - 文字列の比較は、整数と同様に行える
- 文字列の逆順は
文字列[::-1]となる
文字列の定義
文字列の定義は文字列をダブルクォーテーション"、またはシングルクォーテーション'で囲う。
print("Hello World!")
Hello World!
String="hoge"
print(String)
hoge
文字列の結合
文字列の結合は+演算子を使用する。
print("foo"+"bar")
foobar
a="Fizz"
b="Buzz"
print(a+b)
FizzBuzz
s=input()
print(s+"pp")
w=input()
print(w+"s")
n=input()
print("ABC"+n)
文字列の参照
文字列の参照は文字列[参照番号]となる。
String="abc"
print(String[0],String[1],String[2])
a b c
String="abc"
print(String[-1],String[-2],String[-3])
c b a
s=input()
i=int(input())
print(s[i-1])
ABC048 A - AtCoder *** Contest
s=input()
print("A"+s[8]+"C")
a=input()[0]
b=input()[1]
c=input()[2]
print(a+b+c)
文字列の比較
文字列の比較は、整数と同様に行える。
a="Hello"
b="Hello"
print("TRUE" if a==b else "FALSE")
TRUE
a="a"
b="b"
print("a<b" if a<b else "a>b")
a<b
s=input()
print("YES" if s[-1]=="T" else "NO")
a,b=input().split()
print("H" if a==b else "D")
a,b,c=input().split()
print("YES" if a[-1]==b[0] and b[-1]==c[0] else "NO")
n=input()
print("Yes" if n[0]==n[2] else "No")
x,y=input().split()
print("<" if x<y else "=" if x==y else ">")
n=input()
print("Yes" if n[0]==n[1]==n[2] or n[1]==n[2]==n[3] else "No")
s=input()
print("Heisei" if s<="2019/04/30" else "TBD")
文字列の逆順
文字列の逆順は文字列[::-1]となる。
String="abc"
print(String[::-1])
cba
n=input()
print("Yes" if n==n[::-1] else "No")
s=input()
t=input()
print("YES" if s==t[::-1] else "NO")
2.3 リスト(list)
キーポイント
- 要素の追加は
appendメソッドを使用する - 要素の追加は
リスト名.append(データ)でリストの最後に追加される - 要素の探索は
indexメソッドを使用する - 要素の探索は
リスト名.index(データ)でリストの先頭から探索され、一番初めに見つかったインデックスを返却する - 要素の削除は
popメソッドを使用する - 要素の削除は
リスト名.pop(要素番号)で要素番号の要素が削除される - 要素の削除で要素番号を指定しない
リスト名.pop()とリストの最後の要素が削除される - 要素の出現回数は
countメソッドを使用する - 要素の出現回数は
リスト名.count(データ)で出現回数が返却される - 要素のユニーク化はリスト
list型から集合set型に変換することによって要素をユニークにできる - スライスは
リスト名[最初のインデックス:最後のインデックス:ステップ数]となる
要素の追加
要素の追加はappendメソッドを使用する。リスト名.append(データ)でリストの最後に追加される。
List=["a","b","c"]
List.append('d')
print(List)
['a', 'b', 'c', 'd']
List=[0,1,2]
List.append(3)
print(List)
[0, 1, 2, 3]
要素の探索
要素の探索はindexメソッドを使用する。リスト名.index(データ)でリストの先頭から探索され、一番初めに見つかったインデックスを返却する。
List=["a","b","c","d","e","f"]
print(List.index('c'))
2
List=["a","b","c","d","c","c"]
print(List.index('c'))
2
List=[1,2,3,4,5]
print(List.index(3))
2
s="ABCDE"
x=input()
print(s.index(x)+1)
要素の削除
要素の削除はpopメソッドを使用する。リスト名.pop(要素番号)で要素番号の要素が削除される。要素番号を指定しないリスト名.pop()と、リストの最後の要素が削除される。
List=["a","b","c","d","e","f"]
print(List.pop(1))
print(List)
b
['a', 'c', 'd', 'e', 'f']
List=[1,2,3,4,5]
print(List.pop(3))
print(List)
4
[1, 2, 3, 5]
List=[1,2,3,4,5]
print(List.pop())
print(List)
5
[1, 2, 3, 4]
要素の出現回数
要素の出現回数はcountメソッドを使用する。リスト名.count(データ)で出現回数が返却される。
List=["a","b","b","c","c","c"]
print(List.count('c'))
3
List=["a","b","b","c","c","c"]
print(List.count('d'))
0
List=[1,2,3,4,3,5]
print(List.count(3))
2
ABC042 A - 和風いろはちゃんイージー / Iroha and Haiku (ABC Edition)
n=input().split()
print("YES" if n.count("5")==2 and n.count("7")==1 else "NO")
s=input()
print(s.count("1"))
s=input()
print(700+100*s.count("o"))
ABC101 A - Eating Symbols Easy
s=input()
print(s.count("+")-s.count("-"))
要素のユニーク化
要素のユニーク化はリストlist型から集合set型に変換することによって要素をユニークにできる。ただし、要素の順序性は保たれない。
List=[1,2,3,2,1,3]
print(list(set(List)))
[1, 2, 3]
List=["b","a","c","a","b"]
print(list(set(List)))
['b', 'c', 'a']
スライス
Pythonではリストの一部を切り出せるスライスという機能がある。スライスはリスト名[最初のインデックス:最後のインデックス:ステップ数]となる。
List=["a","b","c","d","e"]
print(List[1:3])
['b', 'c']
List=["a","b","c","d","e"]
print(List[1:4:2])
['b', 'd']
List=["a","b","c","d","e"]
print(List[:3])
['a', 'b', 'c']
List=["a","b","c","d","e"]
print(List[3:])
['d', 'e']
s=input()
print("2018"+s[4:])
s=input()
print(s[::2])
第3章 基本処理
第3章では基本処理(よく使われる関数とメソッド)について説明します。
3.1 長さ
キーポイント
- 文字列とリストの長さを得る場合、
len関数を使用する - 文字列とリストの長さを得る場合、
len(データ)となる
文字列
文字列の長さを得る場合、len(変数名)となる。
String="aiueo"
print(len(String))
5
s=input()
print(s[0]+str(len(s)-2)+s[-1])
リスト
リストの長さを得る場合、len(リスト名)となる。
List=["a","b","c","a"]
print(len(List))
4
List=[0,1,2]
print(len(List))
3
s=input()
print("no" if len(s)-len(set(s)) else "yes")
n=input()
print("DIFFERENT" if len(set(n))!=1 else "SAME")
ABC046 A - AtCoDeerくんとペンキ / AtCoDeer and Paint Cans
c=list(input().split())
print(len(set(c)))
s=input()
print("Yes" if len(set(s))==3 else "No")
3.2 ソート
キーポイント
- ソートをする場合、
sorted関数を使用する - ソートは昇順で行われる
- ソートを降順にする場合、
sorted(データ)[::-1]となる
昇順
ソートをする場合、sorted関数を使用する。ソートは昇順で行われる。
List=[2,1,3]
print(sorted(List))
[1, 2, 3]
ABC047 A - キャンディーと2人の子供 / Fighting over Candies
a,b,c=sorted(map(int,input().split()))
print("Yes" if a+b==c else "No")
a,b,c=sorted(map(int,input().split()))
print(a+b)
ABC103 A - Task Scheduling Problem
a,b,c=sorted(map(int,input().split()))
print(c-a)
ABC110 A - Maximize the Formula
A,B,C=sorted(map(int,input().split()))
print(10*C+B+A)
ABC064 B - Traveling AtCoDeer Problem
input()
l=sorted(map(int,input().split()))
print(l[-1]-l[0])
print("Yes" if sorted(input())<sorted(input())[::-1] else "No")
input()
a=sorted(map(int,input().split()))
print(a[-1]-a[0])
降順
ソートを降順にする場合、sorted(データ)[::-1]となる。
List=[2,1,3]
print(sorted(List)[::-1])
[3, 2, 1]
l=[int(input()) for _ in range(3)]
s=sorted(l)[::-1]
for i in l:
print(s.index(i)+1)
3.3 最大値 / 最小値
キーポイント
- 最大値を得る場合、
max関数を使用する - 最小値を得る場合、
min関数を使用する
最大値
最大値を得る場合、max関数を使用する。
- 整数
整数の場合、max(整数A,整数B)となる。
print(max(2,3))
3
- 変数
変数の場合、max(変数名A,変数名B,変数名C)となる。
a=1
b=2
c=3
print(max(a,b,c))
3
- リスト
リストの場合、max(リスト名)となる。
List=[2,4,6,8]
print(max(List))
8
a,b,c=map(int,input().split())
print(max(c//a,c//b))
a,b,c,d=map(int,input().split())
print(max(a*b,c*d))
a,b=map(int,input().split())
print(max(a+b,a-b,a*b))
a,b=map(int,input().split())
print(max(2*a-1,2*b-1,a+b))
最小値
最小値を得る場合、min関数を使用する。
- 整数
整数の場合、min(整数A,整数B)となる。
print(min(2,3))
2
- 変数
変数の場合、min(変数名A,変数名B,変数名C)となる。
a=3
b=4
c=5
print(min(a,b,c))
3
- リスト
リストの場合、min(リスト名)となる。
List=[2,4,6,8]
print(min(List))
2
a,b,c=map(int,input().split())
print(c//min(a,b))
n,x=map(int,input().split())
print(min(x-1,n-x))
a,b,c=map(int,input().split())
print(min(a+b,b+c,c+a))
n,a,b=map(int,input().split())
print(min(n*a,b))
a,b,c,d=[int(input()) for _ in range(4)]
print(min(a,b)+min(c,d))
ABC103 A - Task Scheduling Problem
A=list(map(int,input().split()))
print(max(A)-min(A))
a,b,c=map(int,input().split())
print(min(c,b//a))
ABC064 B - Traveling AtCoDeer Problem
input()
a=list(map(int,input().split()))
print(max(a)-min(a))
3.4 合計値
キーポイント
- 合計値を得る場合、
sum関数を使用する - 合計値を得る場合、
sum(データ)となる
List=[1,2,3]
print(sum(List))
6
n=int(input())
p=[int(input()) for i in range(n)]
print(sum(p)-max(p)//2)
input()
L=list(map(int,input().split()))
print("Yes" if sum(L)>2*max(L) else "No")
l=list(map(int,input().split()))
print(sum(sorted(l)[:2]))
数字和
map関数を使用して、sum(map(int,整数の文字列データ))で数字和を求めることができる。
x="1234"
print(sum(map(int,x)))
10(=1+2+3+4)
x=input()
print(sum(map(int,x)))
n=input()
print("No" if int(n)%sum(map(int,n)) else "Yes")
3.5 絶対値
キーポイント
- 絶対値を得る場合、
abs関数を使用する - 絶対値を得る場合、
abs(数値データ)となる
print(abs(-1))
1
x,a,b=map(int,input().split())
print("A" if abs(a-x)<abs(b-x) else "B")
ABC097 A - Colorful Transceivers
a,b,c,d=map(int,input().split())
print("Yes" if abs(c-a)<=d or abs(b-a)<=d and abs(c-b)<=d else "No")
3.6 置換
キーポイント
- 置換をする場合、
replaceメソッドを使用する - 置換をする場合、
文字列.replace("置換前文字列","置換後文字列")となる
String="abcde"
print(String.replace("bc","xy"))
axyde
ABC111 A - AtCoder Beginner Contest 999
n=input()
print(n.replace("1","x").replace("9","1").replace("x","9"))
s=input()
print(s.replace("Left","<").replace("Right",">").replace("AtCoder","A"))
3.7 大文字小文字変換
キーポイント
- 文字列を大文字に変換する場合、
upperメソッドを使用する - 文字列を大文字に変換する場合、
文字列.upper()となる - 文字列を小文字に変換する場合、
lowerメソッドを使用する - 文字列を小文字に変換する場合、
文字列.lower()となる
大文字変換
文字列を大文字に変換するのはupperメソッドを使用する。文字列.upper()となる。
Text="this is a pen."
print(Text.upper())
THIS IS A PEN.
ABC059 A - Three-letter acronym
for a in input().upper().split():print(a[0],end="")
a,b,c=input().split()
print((a[0]+b[0]+c[0]).upper())
小文字変換
文字列を小文字に変換するのはlowerメソッドを使用する。文字列.lower()となる。
Text="THIS IS A PEN."
print(Text.lower())
this is a pen.
s=input()
print(s[0].upper()+s[1:].lower())
付録
代入演算
代入演算は下記の表の通りとなる。
演算子
記述例
意味
+=
a+=b
a=a+b
-=
a-=b
a=a-b
*=
a*=b
a=a*b
**=
a**=b
a=a**b
/=
a/=b
a=a/b
//=
a//=b
a=a//b
%=
a%=b
a=a%b
a,b=1,2
print(a,b)
1 2
a,b=1,2
a,b=b,a
print(a,b)
2 1
演算子の優先順位
演算子の優先順位はPythonのドキュメントに記載されています。
データ型の確認をする
データ型の確認をする場合、type関数を使用する。
x=10
print(x)
print(type(x))
10
<class 'int'>
x=20.5
print(x)
print(type(x))
20.5
<class 'float'>
x="Hello world!"
print(x)
print(type(x))
Hello world!
<class 'str'>
x=[1,2,3,4,5]
print(x)
print(type(x))
[1, 2, 3, 4, 5]
<class 'list'>
x=(1,2,3,4,5)
print(x)
print(type(x))
(1, 2, 3, 4, 5)
<class 'tuple'>
x={"one":1,"two":2,"three":3}
print(x)
print(type(x))
{'one': 1, 'two': 2, 'three': 3}
<class 'dict'>
x=set()
print(x)
print(type(x))
set()
<class 'set'>