東京海上日動プログラミングコンテスト2023(AtCoder Beginner Contest 307)の解説記事です。
ABC307 A – Weekly Records
問題
問題文の要約は以下の通りです。
問題の要約
\(A_{1}\), \(A_{2}\), \(\cdots\), \(A_{7N}\) を与えたとき、\(B_{i} = A_{7i-6} + A_{7i-5} + \cdots + A_{7i}\) を求めよ。(\(i = 1, 2, \cdots, N\))
制約
・\(1 \le N \le 10\)
・\(1 \le A_{i} \le 10^{5}\)
・入力は整数
入力
\(N\)
\(A_{1}\) \(A_{2}\) \(\cdots\) \(A_{7N}\)
出力
\(B_{1}\) \(B_{2}\) \(\cdots\) \(B_{7N}\)
解説
Aを7回足したら出力するを繰り返す。
解説
まず入力 \(N\) をint
型、\(A\) をlist
として受け取ります。
N=int(input())
A=list(map(int,input().split()))
出力に使うための変数 \(B\) を初期値0
で、何回足し合わせたかをカウントする変数cnt
を初期値0
で用意します。
B=0
cnt=0
i
を0
から7N
までfor
文でループさせ、 \(B\) にA[i]
をcnt
に1
を足します。
7回足し合わせたら \(B\) を出力し、 \(B\) とcnt
を0に戻します。
for i in range(7*N):
B+=A[i]
cnt+=1
if cnt==7:
print(B,end=' ')
B=0
cnt=0
解答
N=int(input())
A=list(map(int,input().split()))
B=0
cnt=0
for i in range(7*N):
B+=A[i]
cnt+=1
if cnt==7:
print(B,end=' ')
B=0
cnt=0
ABC306 B – racecar
問題
問題文の要約は以下の通りです。
問題の要約
英小文字のみからなる \(N\) 個の文字列 \(S_{1}\), \(S_{2}\), \(\cdots\), \(S_{N}\) が与えられます。\(N\) 個の文字列から2つ選び、その2つを連結した文字列が回文となるものは存在するか判定せよ。
制約
・\(2 \le N \le 100\)
・\(1 \le |S_{i}| \le 50\)
・\(N\) は整数
・\(S_{i}\) は英小文字のみからなる文字列
・\(S_{i}\) はすべて異なる。
入力
\(N\)
\(S_{1}\)
\(S_{2}\)
\(\vdots\)
\(S_{N}\)
出力
回文となる文字列が存在すればYes
を、そうでないならば No
を出力せよ。
解説
2つの組み合わせがそれぞれ回文かどうか判定します。
最大でも100×100通り試せばよいので十分間に合います。
解説
まずは2つ文字列を与えたときに回文かどうか判定する関数を定義します。
関数をkaibun_check
として引数として2つの文字列を与えます。
与えられた文字列を連結した文字列s
の最初と最後を判定、最初の次の文字、最後の次の文字と順に同じ文字であるか判定していきます。s
の長さの半分まで判定し、すべて一致したら回文です。回文であれば、True
を、回文でなれけばFalse
を返します。
# 回文かどうか判定する関数
def kaibun_check(a,b):
s=a+b
for i in range(len(s)//2):
if s[i]!=s[len(s)-i-1]:
return False
return True
判定するロジックができたら実際に入力を受け取り処理を行います。
まず、入力 \(N\) と \(S\) を受け取ります。
N=int(input())
S=[input() for i in range(N)]
\(S\) を2重ループで回し、同じ文字列であればcontinue
、異なれば、先ほど定義した関数で回文かどうか判定します。
回文であればYes
を出力し、すべての組み合わせが回文でなければNo
を出力します。
for i in range(N):
for j in range(N):
if i==j:
continue
elif kaibun_check(S[j],S[i]):
print('Yes')
exit()
print('No')
解答
# 回文かどうか判定する関数
def kaibun_check(a,b):
s=a+b
for i in range(len(s)//2):
if s[i]!=s[len(s)-i-1]:
return False
return True
N=int(input())
S=[input() for i in range(N)]
for i in range(N):
for j in range(N):
if i==j:
continue
elif kaibun_check(S[j],S[i]):
print('Yes')
exit()
print('No')