パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)の解説記事です。
ABC301 A – Overall Winner
問題
問題文の要約は以下の通りです。
問題の要約
T
と A
からなる長さN の文字列 S が与えられます。T
と A
のどちらが多いか答えよ。
ただし同数の場合は文字列の先頭から見て先にその数に達している方を出力せよ。
入力
N
S
出力
T
または A
を出力せよ。
解説
T
と A
のどちらが多いか判定する。
同数の場合は最後の文字ではない方が答えになる。
解説
まず、T
とA
がそれぞれ何文字含まれているかを求めます。
T = S.count('T')
A = S.count('A')
T
の方がA
より多ければT
を出力し、T
よりA
のほうが多ければA
を出力します。
if T > A:
print('T')
elif T < A:
print('A')
同数だった場合は文字列の先頭から見て先にその数に達している方、すなわち最後の文字ではない方になります。
最後の文字がA
であればT
を出力し、T
であればA
を出力します。
elif S[N-1] == 'A':
print('T')
else:
print('A')
解答
N = int(input())
S = input()
T = S.count('T')
A = S.count('A')
if T > A:
print('T')
elif T < A:
print('A')
elif S[N-1] == 'A':
print('T')
else:
print('A')
先にA
とT
が同数か判定し、print
内でT
とA
のどちらを出力するか判定することもできます。
N = int(input())
S = input()
T = S.count('T')
A = S.count('A')
if T==A:
print('T' if S[N-1]=='A' else'A')
else:
print('T' if T>A else'A')
ABC301 B – Fill the Gaps
問題
問題文の要約は以下の通りです。
問題の要約
自然数からなり、どの隣接する 2 項の値も相異なる、長さ N の数列 A1 , A2 , … , AN を与えます。
どの隣接する 2 項の差の絶対値が1になるように Ai , Ai+1の間に
Ai + 1, Ai + 2 , … , Ai+1 -1
または
Ai – 1 , Ai – 2 , … , Ai+1 +1
を挿入し、その結果得られる数列を出力せよ。
入力
N
A1 A2 … AN
出力
得られる数列を出力せよ。
解説
A1 から順番に出力し、Ai , Ai+1の差の絶対値が1でなければ、間の数を出力する。
解説
まずはA[0]を出力します。
if i==0:
print(A[0],end=' ')
Ai , Ai+1の差の絶対値が1であればそのまま出力します。
elif A[i]-A[i-1]==1 or A[i-1]-A[i]==1:
print(A[i],end=' ')
Ai , Ai+1の差の絶対値が1でなければ、Ai , Ai+1の間に
Ai + 1, Ai + 2 , … , Ai+1 -1
または
Ai – 1 , Ai – 2 , … , Ai+1 +1
を挿入する。
elif A[i-1]<A[i]:
for j in range(1,A[i]-A[i-1]+1):
print(A[i-1]+j,end=' ')
else:
for j in range(1,A[i-1]-A[i]+1):
print(A[i-1]-j,end=' ')
解答
N=int(input())
A=list(map(int,input().split()))
for i in range(N):
if i==0:
print(A[0],end=' ')
elif A[i]-A[i-1]==1 or A[i-1]-A[i]==1:
print(A[i],end=' ')
elif A[i-1]<A[i]:
for j in range(1,A[i]-A[i-1]+1):
print(A[i-1]+j,end=' ')
else:
for j in range(1,A[i-1]-A[i]+1):
print(A[i-1]-j,end=' ')
ABC301 C – AtCoder Cards
問題
解説
各文字の個数が異なるときに、@
を置き換えることで各文字の個数を一致させることができるかどうか判定する。
解説
英小文字のアルファベットを含む文字列alp
を用意し、これを基準にして文字の比較を行います。
# 英小文字のアルファベット
alp = "abcdefghijklmnopqrstuvwxyz"
2つの文字列S
とT
を入力として受け取ります。
# 入力された2つの文字列を取得
S = input()
T = input()
2つの文字列における@
の数を数えます。
# '@'のカードの数を数える
S_at = S.count('@')
T_at = T.count('@')
アルファベットの各文字に対して、2つの文字列での出現回数を比較します。このとき数が同じなら何もしません。
# 英小文字を1つずつチェック
for i in range(26):
# 同じ文字の数が等しいかチェック
if S.count(alp[i]) == T.count(alp[i]):
pass # 数が同じなら何もしない
数が異なり、atcoder
に含まれない場合は勝利不可能なのでNo
を出力します。
elif alp[i] not in 'atcoder':
# 'atcoder'に含まれない文字で数が異なる場合、勝利不可能
print("No")
exit() # 終了
文字がatcoder
に含まれる場合、@
を適切に置き換えることで数の不一致を調整します。
このとき、@
の数が負になる場合、つまり必要な置換が@
のカードの数を超える場合は、勝利条件を満たすことができNo
を出力します。
else:
# 'atcoder'に含まれる文字で数が異なる場合、'@'を適切に置換
if S.count(alp[i]) > T.count(alp[i]):
T_at -= S.count(alp[i]) - T.count(alp[i])
else:
S_at -= T.count(alp[i]) - S.count(alp[i])
# '@'の数が負になる場合は、不正な置換が発生している
if S_at < 0 or T_at < 0:
print("No")
exit() # プログラム終了
# すべてのチェックをパスしたら、勝利可能
print("Yes")
すべての文字についてチェックし、上記の条件を満たす場合はYes
を出力します。
# すべてのチェックをパスしたら、勝利可能
print("Yes")
解答
# 英小文字のアルファベット
alp = "abcdefghijklmnopqrstuvwxyz"
# 入力された2つの文字列を取得
S = input()
T = input()
# '@'のカードの数を数える
S_at = S.count('@')
T_at = T.count('@')
# 英小文字を1つずつチェック
for i in range(26):
# 同じ文字の数が等しいかチェック
if S.count(alp[i]) == T.count(alp[i]):
pass # 数が同じなら何もしない
elif alp[i] not in 'atcoder':
# 'atcoder'に含まれない文字で数が異なる場合、勝利不可能
print("No")
exit() # 終了
else:
# 'atcoder'に含まれる文字で数が異なる場合、'@'を適切に置換
if S.count(alp[i]) > T.count(alp[i]):
T_at -= S.count(alp[i]) - T.count(alp[i])
else:
S_at -= T.count(alp[i]) - S.count(alp[i])
# '@'の数が負になる場合は、不正な置換が発生している
if S_at < 0 or T_at < 0:
print("No")
exit() # プログラム終了
# すべてのチェックをパスしたら、勝利可能
print("Yes")