AtCoder Beginner Contest 403(Promotion of AtCoder Career Design DAY)の解説記事です。
ABC403 A – Odd Position Sum
問題
問題文の要約は以下の通りです。
問題の要約
長さ \(N\) の正整数列 \(A=(A_1,A_2,\cdots,A_N)\) が与えられるので、\(A\)の奇数番目の要素の総和を求めよ。
解説1
for
文で全ての要素をループして、if
文で奇数番目か判定する。
解説
入力を受け取ります。
# 入力
N=int(input())
A=list(map(int,input().split()))
奇数番目の要素の総和の変数ans
を用意します。奇数番目の要素は0-indexedのとき偶数番目なので、偶数番目をすべて足します。
# 奇数番目の要素の総和
ans=0
# 0-indexedなので偶数番目をすべて足す
for i in range(N):
if i%2==0:
ans+=A[i]
# 出力
print(ans)
解答
# 入力
N=int(input())
A=list(map(int,input().split()))
# 奇数番目の要素の総和
ans=0
# 0-indexedなので偶数番目をすべて足す
for i in range(N):
if i%2==0:
ans+=A[i]
# 出力
print(ans)
解説2
for
文でステップを使用して、2ずつ増加するループを使用する。
Pythonのfor
ループでステップを指定するには、range(start, stop, step)
を使います。
解説
入力を受け取ります。
# 入力
N=int(input())
A=list(map(int,input().split()))
奇数番目の要素の総和の変数ans
を用意します。奇数番目の要素は0-indexedのとき偶数番目なので、偶数番目をすべて足します。偶数番目のみループで回すにはfor i in range(0,N,2):
と記述します。
# 奇数番目の要素の総和
ans=0
# 0-indexedなので偶数番目をすべて足す
for i in range(0,N,2):
ans+=A[i]
# 出力
print(ans)
解答
# 入力
N=int(input())
A=list(map(int,input().split()))
# 奇数番目の要素の総和
ans=0
# 0-indexedなので偶数番目をすべて足す
for i in range(0,N,2):
ans+=A[i]
# 出力
print(ans)
ABC403 B – Four Hidden
問題
問題文の要約は以下の通りです。
問題の要約
英小文字と?
からなる文字列 \(T\) と、英小文字のみからなる文字列 \(U\) が与えられます。 \(T\) は、英小文字のみからなる文字列 \(U\) のちょうど \(4\) 文字を?
で置き換えることで得られた文字列です。 \(S\) が \(U\) を連続部分文字列として含んでいた可能性があるかどうか判定せよ。
解説
\(T\) のすべての \(U\) と同じ長さの部分列について、\(U\) と一致できるかを判定する。
解説
入力を受け取ります。
# 入力
T=input()
U=input()
\(T\) のすべての \(U\) と同じ長さの部分列について、\(U\) と一致できるかを判定します。
- \(T\) の先頭から末尾まで、 \(U\) が入り得る位置をすべて試します。
- 各位置
i
で、 \(T\) のi
文字目以降が \(U\) と一致するかを調べます。その際、i+j==len(T)
で、\(T\) の末尾を超えてしまう場合を除外し、T[i+j]!='?' and T[i+j]!=U[j]
の条件で、?
以外で一致しない場合を除外します。 - 一致する位置が1つでもあれば
Yes
を出力し、なければNo
を出力します。
# Tの各位置 iについて、一致するかどうかを調べる
for i in range(len(T)):
# Uがこの位置で一致するかを判定するフラグ
flag=True
for j in range(len(U)):
# Tの末尾を超える or 文字が一致しない('?'なら一致)
if i+j==len(T) or (T[i+j]!='?' and T[i+j]!=U[j]):
# フラグをFalseにしてループを抜ける
flag=False
break
if flag:
# 一致した場合はYesを出力して終了
print('Yes')
exit()
# どこにも一致しなかった場合はNoを出力
print('No')
解答
# 入力
T=input()
U=input()
# Tの各位置 iについて、一致するかどうかを調べる
for i in range(len(T)):
# Uがこの位置で一致するかを判定するフラグ
flag=True
for j in range(len(U)):
# Tの末尾を超える or 文字が一致しない('?'なら一致)
if i+j==len(T) or (T[i+j]!='?' and T[i+j]!=U[j]):
# フラグをFalseにしてループを抜ける
flag=False
break
if flag:
# 一致した場合はYesを出力して終了
print('Yes')
exit()
# どこにも一致しなかった場合はNoを出力
print('No')