【AtCoder】ABC301解説(Python)

パナソニックグループプログラミングコンテスト2023(AtCoder Beginner Contest 301)の解説記事です。

目次

ABC301 A – Overall Winner

問題

問題文の要約は以下の通りです。

問題の要約

TAからなる長さN の文字列 S が与えられます。TA のどちらが多いか答えよ。
ただし同数の場合は文字列の先頭から見て先にその数に達している方を出力せよ。

入力

N
S

出力

T または A を出力せよ。

解説

TA のどちらが多いか判定する。
同数の場合は最後の文字ではない方が答えになる。

解説

まず、TAがそれぞれ何文字含まれているかを求めます。

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')

先にATが同数か判定し、print内でTAのどちらを出力するか判定することもできます。

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つの文字列STを入力として受け取ります。

# 入力された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")
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次