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