図解解説シリーズ
競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。
問題文
情報オリンピック日本委員会に掲載されている問題
AtCoderに掲載されている問題
入出力など実際に確認して自分の作成したプログラムを採点することができます。
図解解説
今年度の一次予選のC問題は、以下の4つのスキルを確認する問題になっています。
1.入力・出力を正しく利用できる
2.算術演算子を正しく利用できる
3.条件分岐(if)を正しく利用できる
4.繰り返し処理を正しく利用できる
問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
Pythonでの文字列は、1文字ごとに先頭から0,1,2,3,…と番号が割り当てられています。したがって、先頭の文字は「変数名[0]」と指定して取り出すことができます。この仕組みを利用して、文字列の先頭から1文字ずつ順番にA,B,C,D,Eのどの文字か確認していく作業を行います。
確認したA,B,C,D,Eをどのように管理すればよいか考えてみます。さまざまな方法がありますが、ここでは2つの場合を示します。
変数a,b,c,d,eを用意し、初期値を0にします。文字列Sの中に文字Aが含まれていたら、変数aの値を1にします。含まれていなければ初期値のまま0とします。同様に、文字列Sの中に文字Bが含まれていたら、変数bの値を1にします。含まれていなければ初期値のまま0とします。この作業を、文字C、文字D、文字Eまで行います。この作業を行うと、それぞれ文字が存在すれば、変数の値は1になります。a+b+c+d+eを計算すれば文字列Sの中にA,B,C,D,Eの文字が何種類含まれているか確認することができます。
Pythonに含まれるcountメソッドを使用します。文字列Sに含まれる文字Aの数は、S.count('A')で確認できます。同様に、文字列Sに含まれる文字Bの数は、S.count('B')で確認できます。この作業を文字C、文字D、文字Eまで行えば、それぞれの文字が含まれているかどうか確認することができます。文字の種類数を管理する変数cntを用意し、初期値を0とします。S.count('A')>0なら変数cntに1を加え、S.count('B')>0なら変数cntに1を加え、…と繰り返せば、文字の種類数を求めることができます。
解答例
5つ変数を用意した場合
N = int(input())
S = str(input())
#それぞれの文字があるかどうかチェックするための変数を5つ用意
#それぞれ初期値として0をあてはめる
a = 0
b = 0
c = 0
d = 0
e = 0
#文字列の先頭から1文字ずつ確認を行い、文字S[i]がAならa=1、Bならb=1、…と処理を行う
for i in range(N):
if S[i]=='A':
a = 1
if S[i]=='B':
b = 1
if S[i]=='C':
c = 1
if S[i]=='D':
d = 1
if S[i]=='E':
e = 1
#5つの変数を足し合わせ、3以上ならYes、それ以外ならNoを出力する
if a+b+c+d+e>=3:
print('Yes')
else:
print('No')
Pythonの機能を使った例
効果的に機能を活用すると、アルゴリズムを簡単にすることができます。
N = int(input())
S = str(input())
#Pythonの持つcountメソッドを利用してそれぞれの文字が含まれているかどうか確認する
#A,B,C,D,Eの文字の種類数については変数cntで管理する
#A,B,C,D,Eのそれぞれについて文字が含まれているかどうか確認し、
#含まれている場合(1文字以上ある場合)は変数cntの値を1増やす
cnt = 0
if S.count('A')>0:
cnt = cnt + 1
if S.count('B')>0:
cnt = cnt + 1
if S.count('C')>0:
cnt = cnt + 1
if S.count('D')>0:
cnt = cnt + 1
if S.count('E')>0:
cnt = cnt + 1
if cnt>=3:
print('Yes')
else:
print('No')
なお、配列(リスト)と繰り返し処理を行うことで、短い行数で命令を記述することができます。
N = int(input())
S = str(input())
#Pythonの持つcountメソッドを利用してそれぞれの文字が含まれているかどうか確認する
#含まれている場合は、変数cntの値を1増やしてA,B,C,D,Eの文字の種類数を管理する
#リストmojiを作成し、A,B,C,D,Eの文字を格納しておく
#格納した文字を1つずつ取り出して、繰り返し処理を行うことで
#短い行数でプログラムを記述することができる
cnt = 0
moji = ['A','B','C','D','E']
for m in moji:
if S.count(m)>0:
cnt = cnt + 1
#変数cntの値を確認し、3以上ならYes、それ以外ならNoを出力する
if cnt>=3:
print('Yes')
else:
print('No')
イラスト
スライド内で使用しているイラストはすべて「いらすとや」の素材を利用しています。