TPTブログ

テックポート株式会社のブログです。 技術情報や製品・サービス情報、 また未経験社員がデータサイエンティストを 目指す奮闘記など、更新していきます。

AtCoder-練習問題を解きまくる1

f:id:tbtech:20210705162852p:plain
前回に続きAtCoderに挑戦していきます!
これまでは初心者向けに選抜された11問をとりあえず解いてみましたが
これだけではまだまだコンテストで高得点は狙えません(´·×·`)

そこで今回からは練習問題をばんばん解いていきたいと思います0(`・ω・´)=〇シュッ

AtCoder Scores

AtCoder Scores
こちらは公式ではなく、有志で作られた練習問題サイトで
AtCoderの問題の点数ごとに、過去問を練習することが出来ます。

f:id:tbtech:20210702132511p:plainf:id:tbtech:20210702132534p:plain
「ユーザー指定」の「挑戦者」の欄(上左図)に自分のAtCoderのユーザ名を入れると、
フィルタ(上右図)で自分が解けた問題は非表示にするなど絞り込めるのがとても便利です。

f:id:tbtech:20210702132909p:plain
問題はこのように点数の低い順に表示されるので、自分が解きたい点数の
色のところを選ぶと対象の問題が下にずらずらと表示されます。

点数が100点の問題はとっても簡単なので、
今回は200点の問題から挑戦していこうと思います(☆∀☆)!

ABC044B - 美しい文字列

問題文
w を、英小文字のみからなる文字列とします。 w が以下の条件を満たすならば、w を美しい文字列と呼ぶことにします。
どの英小文字も、w 中に偶数回出現する。
文字列 w が与えられます。w が美しい文字列かどうか判定してください。

w=input()
w_u = list(set(w))
for a in w_u:
    if w.count(a) %2==1:
        print('No')
        exit()
print('Yes')

xに文字列を格納し、setでxに含まれる文字の固有値を抽出しx_uにリスト化します。
forで固有値を順にaへ取り出し、aが文字列xにいくつ含まれるかカウントし、
その数が2で割り切れないならNoと出力し作業を終わります。
forが全て回ったら文字は全て偶数個あるということになり、Yesと出力します。

ABC046B - AtCoDeerくんとボール色塗り

問題文
シカのAtCoDeerくんは一列に並んだ N 個のボールをそれぞれ K 色のペンキの色のうちのどれかで塗ろうとしています。見栄えが悪くならないように、隣り合ったボールは別の色で塗ることにします。ボールの塗り方としてあり得るものの個数を求めてください。

n,k = map(int,input().split())
print(k*(k-1)**(n-1))

nにボールの数、kにペンキの数を格納します。
各ボールが何通りのペンキを塗れるかを考えます。1つ目のボールはk個のペンキ全て塗れるのでk通り、
2個目以降は隣のボール(2個目ならば1個目のボール)が1色使っているのでそれ以外の色で塗れるので、
k-1色になります。つまり、k-1通りがn-1回選ばれることになります。
f:id:tbtech:20210705162439j:plain

ABC052B - Increment Decrement

問題文
あなたは整数 x を持っています。 最初、x=0 です。あなたは、長さ N の文字列 S をもらったので、これを使って N 回の操作を行いました。 i 回目の操作では、Si=I ならば x の値を 1 増やし、Si=D ならば x の値を 1 減らしました。操作の途中( 1 回目の操作の前、N 回目の操作の後も含む)で x がとる値の最大値を答えてください。

n, s = open(0).read().split()
x=0
x_max=0
for i in s:
  if i=='I':
    x+=1
  else:
    x-=1
  x_max=max(x,x_max)
print(x_max)

nに文字数、sに文字列を格納します。xとxの最大値を入れる変数x_maxを準備しておきます。
forで順に文字列sから1文字ずつiへ入れて、iが「I」ならxが1増え、「D」ならxは1減らします。
xの操作をしたら、xとx_maxを比較し、xがx_maxより大きいならx_maxをそのxで更新します。
そうしてsの全ての文字を確認したら、x_maxの最終値を出力します。

ABC053B - A to Z String

問題文
すぬけくんは文字列 s の連続した一部分(部分文字列という)を取り出して先頭が A であり末尾が Z であるような文字列を作るとにしました。 すぬけくんが作ることのできる文字列の最大の長さを求めてください。 なお,s には先頭が A であり末尾が Z であるような部分文字列が必ず存在することが保証されます。

s=input()
a=s.index('A')
z=s.rindex('Z')
print(z-a+1)

sに文字列を格納し、s.index('A')で左から探索して初めに見つけたAのindexをaに入れます。
s.rindex('Z')は右から探索して初めて見つけたZのindexをzに入れます。
aとzの差に1を足すと部分文字列の長さになります。


つづく٩(ˊᗜˋ*)و