見出し画像

[ABC283 Python]ユニークビジョンプログラミングコンテスト2022 冬(AtCoder Beginner Contest 283)A~C問題Python解説

おまけでD問題もあります。ぜひご覧ください。

A問題

A, B = map(int, input().split())
print(A**B)

問題分にある通り、A^Bを出力します。
Pythonでは、A^BをA**Bとして出力することで、答えを得ることができます。

B問題

N = int(input())
A = list(map(int, input().split()))
Q = int(input())
for i in range(Q):
    query = list(map(int, input().split()))
    if query[0] == 1:
        k = query[1] - 1
        x = query[2]
        A[k] = x
    else:
        k = query[1] - 1
        print(A[k])

クエリの指示通りに指示を実行しましょう。
クエリは全部でQ個与えられ、
[1, k, x]または[2, x]です。
先頭が1の時はAkの値をxに変更する。
先頭が2の時はAkの値を出力する。
という指示を実行します。
注意するポイントとしては、
kの値はAkでインデックスを表すので、
初めに-1しておくことで、求めることができます。

C問題

S = input()
len0 = S.count("00")
print(len(S) - len0)

レジの機械には11個のボタンがありますが、
出力するのはボタンを押した回数の合計なので、
ボタンの種類は気にする必要がありません。
表示されている数を10倍とか100倍とか書いてますが、
表示されている数を文字列として捉えて考えてみると、
11個のボタンを押すと、
文字列の末尾にそのボタンの文字列が追加されると考えればよいです。
例えば、
表示されている数が4000で4のボタンを押すと、
"4000"+"4" = "40004"
となります。

このように考えると、
「0~9のボタンを押すと桁が1つ増え、00のボタンを押すと桁が2つ増える」ことが分かりますね。
00は2回分になりますので、00の分を1回分全体から引いてあげれば、答えを求めることができます。

おまけ:D問題

from collections import defaultdict
S = input()
d = defaultdict(int)
now = []
for i in S:
    if i == "(":
        d[i] = 1
    elif i == ")":
        for j in now:
            d[j] = 0
            now = []
    else:
        if d[i] == 1:
            print("No")
            exit()
        else:
            d[i] = 1
            now.append(i)
print("Yes")

基本的には既に出てきた文字が再度出現すれば、気絶してしまうので、
Noと出力します。
ただ、()で囲まれた文字列は消去されるので、
「()で囲まれていない文字列で2度目の出現したものは気絶の対象である」と考えればいいでしょう。

変数としてdefaultdict dとリストnowを用意します。
dはその文字が出現したかしていないかを管理します。
(出現1、未出現0)
文字列を先頭から見ていき、英小文字であれば、
d[英小文字] = 1とします。
また、リストnowには現在「(英小文字」となっている
(つまりかっこが不完全)
になっている英小文字を保存しておきます。
文字列を先頭から見ていき、「)]にであれば、
d[英小文字] = 0とし、nowは削除しましょう。

この記事が気に入ったらサポートをしてみませんか?