【AtCoder】ABC307解説(Python)

AtCoder_ABC307

東京海上日動プログラミングコンテスト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

i0から7Nまでfor文でループさせ、 \(B\) にA[i]cnt1を足します。
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')
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次