【AtCoder】ABC403解説(Python)

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\) と一致できるかを判定します。

  1. \(T\) の先頭から末尾まで、 \(U\) が入り得る位置をすべて試します。
  2. 各位置iで、 \(T\) のi文字目以降が \(U\) と一致するかを調べます。その際、i+j==len(T) で、\(T\) の末尾を超えてしまう場合を除外し、T[i+j]!='?' and T[i+j]!=U[j] の条件で、?以外で一致しない場合を除外します。
  3. 一致する位置が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')
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次