1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder ABC381 復習(緑コーダーがPythonでA〜Cを解答)

Posted at

ABC381 感想まとめ

今回は珍しく、金曜日の21時から開催。私は平日のため仕事に疲れ果てて降り、寝てしまっていました。そのため、土日に復習で問いたものを掲載します。

A - 11/22 String

問題文中の 11/22 文字列 をあらかじめ作っておいて、それと入力 S を比較しました。

N = int(input())
S = input()

half = (N + 1) // 2 - 1 # 半分の長さ
str = "1" * (half) + "/" + "2" * (half) # 11/22の文字列を作る

if S == str:
    print("Yes")
else:
    print("No")

B - 1122 String

問題文に数式が入っていてが若干わかりにくかった(麻雀を知っている人向けには、「数列がチートイツ かどうかを判定する問題」と言い換えられる)。

回答は、与えられた条件を順にチェックして、最後まで残ったら Yes という流れにしました。

S = input()

# 偶数チェック
if len(S) % 2 != 0:
    print("No")
    exit()

# ペアチェック
for i in range(1, len(S), 2):
    if S[i-1] != S[i]:
        print("No")
        exit()

# 個数==2 かチェック
counter = defaultdict(int)
for s in S:
    counter[s] += 1

for k, v in counter.items():
    if v != 2 :
        print("No")
        exit()

C - 11/22 Substring

下記のような流れで処理しました。

  1. "1"の数をカウント(この段階では、"1" 以外の文字はスルー)
  2. "1"の連続の後に "/" が来るか判定
  3. "/" の後に "2" の連続があるか判定
    1. ここで、条件を満たす文字列が出来るなら、その長さを更新する

文字をカウントする one_counter, two_counter, slash_counter を用意し、パターンに応じて増やしたり初期化したりします。

N = int(input())
S = input()

one_counter = 0 # 1 のカウンター
two_counter = 0 # 2 のカウンター
slash_counter = 0
answer = 0 # 答えを格納

for i in range(N):
    # "1"の数をカウント
    if S[i] == '1':
        if slash_counter > 0 or two_counter > 0:
            one_counter = 0
        one_counter += 1
        two_counter = 0
        slash_counter = 0
        continue

    if S[i] == '/':
        slash_counter += 1
        # slashがあれば、最低1にはなる
        answer = max(answer, 1)

        two_counter = 0
        continue   

    if S[i] == '2':
        # "1"の連続の後に "/" が来るか判定
        if slash_counter != 1 or one_counter == 0:
            slash_counter = 0
            one_counter = 0
            two_counter = 0
            continue

        # "/" の後に "2" の連続があるか判定
        two_counter += 1
        if slash_counter == 1:
            if one_counter > 0:
                # 条件を満たす文字列が出来るなら、その長さを更新する
                same_count = min(one_counter, two_counter)
                answer = max(answer, same_count * 2 + 1)
        else:
            # slash がない or 多い場合はリセット
            slash_counter = 0
            one_counter = 0

print(answer)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?