3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

競技プログラミングAdvent Calendar 2022

Day 3

【ABC280】A~C問題のPython解答と実装の整理

Last updated at Posted at 2022-12-03

Qiitaで記事を書くのが初めてのさざんかです
今年こそは書いてみようと思いもう12月です...

ABC280の復習もかねて説いた内容と文法を整理しようと思います
公式の解説が理解できたらもう一度コードを書いてみようかなと思います

AtCoderとは

AtCoderは、オンラインで参加できるプログラミングコンテスト(競技プログラミング)のサイトです。リアルタイムのコンテストで競い合ったり、約5000問のコンテストの過去問にいつでも挑戦することが出来ます
https://atcoder.jp/home

ABCは毎週開催なので参加しやすいですよね!

A - Pawn on a Grid

上下左右に広がる H 行 W 列のマス目があり、各マスにはコマが置かれているか、何も置かれていないかのどちらかです。マス目上のマスのうち、コマが置かれているようなものの個数を求めてください。
https://atcoder.jp/contests/abc280/tasks/abc280_a

入力例

3 5
#....
.....
.##..

出力例

3

ここで、3が行数、5が列数でそのあとの記号が「コマがおかれているかどうか」になります
そこでコマがいくつかるか、すなわち#がいくつあるかを考えればいいですね

なので入力で得た2次元配列を1次元配列に直して考えてあげると

実装例

H , W = map(int,input().split())
block = []
a_block = []
for i in range(H):
    block.append(list(input()))

for i in block:
    for j in i:
        a_block.append(j)
answer = a_block.count('#')
print(answer)

こんな感じで実装できるかなと思います
特につっかえたところはなかったです

B - Inverse Prefix Sum

整数 N と長さ N の数列 S=(S1,…,SN) が与えられます。長さ N の数列 A=(A 1,…,AN) であって、k=1,…,N の全てについて以下の条件を満たすものを求めてください。
A1+A2+…+Ak = Sk
https://atcoder.jp/contests/abc280/tasks/abc280_b

入力例

3
3 4 8

出力例

3 1 4

問題文をすんなり理解することはできませんでしたが少し読み解くと、つまりS[k]がA[k]までの和になるようにしてください、ということなのでS[0]=A[0]でありS[1] = SUM[A] + S[1] - S[0] のように差分を足していけばよいので

実装例

N = input()
S = list(map(int,input().split()))
A = []

count = 0
for i in S:
    A.append(int(S[count]) - sum(A))
    count += 1

print(*A)

こんな感じで実装できました

C - Extra Character

文字列 S,T が与えられます。S は英小文字からなり、T は S に英小文字を 1 つ挿入して作られたことがわかっています。
挿入された文字は T の先頭から何番目の文字であるか求めてください。
複数の候補が考えられる場合はいずれか 1 つを求めてください。
https://atcoder.jp/contests/abc280/tasks/abc280_c

入力例

atcoder
atcorder

出力例

5

この問題は制約が最大でも10⁵までの文字数の文字列までしか与えられないので何も考えずに1文字ずつ比較していくのでいいのかなと思いました。

実装例

S = list(input())
T = list(input())
S.append('')
for s,t,c in zip(list(S),list(T),range(len(T))):
    if s == t:
        continue
    else:
        print(c+1)
        break

気を付けないといけないのが付け足された文字が最後にある場合に3行目がないと答えが出ないことです
そこで10分くらいACにならなくて悩みました...
最後の文字までfor文で計算してもらうためにSの文字列に空白を末尾に入れています

感想

D問題の素因数分解までは思いつきましたがそこから条件を満たす最小の数字を導けませんでした...
ここまで読んでくださりありがとうございます!
競プロの勉強とともにより分かりやすい・読みやすい文章を書けるようにしたいです...
それではまた来週!

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?