ABC219参戦記

プログラミング

サイシードプログラミングコンテスト2021(ABC219)の参加記録です。
A問題からC問題まで、私が理解した内容を記載します。

使用言語はPython3です。レート600前後です。

A – AtCoder Quiz 2

標準入出力と条件分岐が書けるかの問題。
入力で与えられた得点がどこの区間に入るかを判定し、出力したらOKですね。

# サイシードプログラミングコンテスト2021(AtCoder Beginner Contest 219)
# A - AtCoder Quiz 2

X=int(input())
if X >= 90:
    print("expert")
elif X >= 70:
    print(90-X)
elif X >= 40:
    print(70-X)
else:
    print(40-X)

B – Maritozzo

繰り返し処理が出来るかを問われる問題。または、replace() を利用できるかが問われる問題。

入力で受け取るTの各数字を入力で受け取る文字列3つに変換する問題ですね。
S1からS3までの入力をSという一つの配列に格納して準備しておき、Tを順番に見ていく中で、対応するSの配列にある要素に置き換えて答え用の変数に足し合わせていけばOKですね。

# サイシードプログラミングコンテスト2021(AtCoder Beginner Contest 219)
# B - Maritozzo

S1=input()
S2=input()
S3=input()
S=[S1,S2,S3]
T=input()

ans=""
for i in range(len(T)):
    ans+=S[int(T[i])-1] # 入力は1-indexで、配列は0-index
print(ans)

この他にも、今回の問題では、S1,S2,S3は英子文字だけという制約があるため、replaceでも処理が可能です。
(S1,S2,S3に数字が含まれているとNGの場合があります。)

S1=input()
S2=input()
S3=input()
T=input()

ans=T.replace("1",S1).replace("2",S2).replace("3",S3)
print(ans)

C – Neo-lexicographic Ordering

対象の文字が、配列の何番目に来るかを調べられるかと、二次元配列のソートが出来るかを問われる問題。

方針は以下の通りです。

①Xで与えられた辞書順の辞書を作成する。
②名前を構成する各文字が、新しい辞書で何番目小さい文字なのかを調べて、配列に格納していく。
③②で作った配列と、名前の組の配列をソート用の配列に格納していく。
④ソート用の配列をソートする。
⑤ソートした配列の名前だけを出力していく。

これらを落とし込んだものが以下のコードになります。

# サイシードプログラミングコンテスト2021(AtCoder Beginner Contest 219)
# C - Neo-lexicographic Ordering

X=input()

# Xで与えられた辞書順の辞書を作成する。
dic=dict()
for i in range (len(X)):
    dic[X[i]] = i

N=int(input())

names=[]
for _ in range(N):
    name=input()
    new_order=[]
    # 名前を構成する各文字が、新しい辞書で何番目小さい文字なのかを調べて、配列に格納していく。
    for e in name:
        new_order.append(dic[e])
    # 上で作った配列と、名前の組の配列をソート用の配列に格納していく。
    names.append([new_order,name])

# ソート用の配列をソートする。
names.sort()

# ソートした配列の名前だけを出力していく。
for name in names:
    print(name[1])

コメント

タイトルとURLをコピーしました