AtCoder Beginner Contest(ABC) 280 - Pythonでのバーチャル参加結果と内容整理

# 1. 前書き
AtCoderBeginnerContest(ABC)の参加結果と内容の整理、および外部の解説記事を参考にした上で、自分なりに解法を整理していきます。
使用言語はPythonで行きます。本業ではJavaかRubyonRailsユーザーですが、計算速度の問題であったり、トレンドに乗っておくという意味でも（こちらが大きい）、Pythonに慣れていきたいと思います。

# 2. コンテスト内容
- コンテスト名
    - AtCoder Beginner Contest 280
- 開催日時
    - 2022/12/3(土) 21:00 - 22:40
- 実施区分
    - バーチャル参加
    - 2022/12/6(火)

# 3. 結果
|区分|結果|所要時間|実行時間|
|:--|:--|:--|:--|
|A問題|AC|4:36|22ms|
|B問題|AC|10:43|22ms|
|C問題|AC|30:28(3)|128ms|
|D問題|WA|-|-|

# 4. 解説

## 4-1. A - Pawn on a Grid

### 4-1-1. 問題文
上下左右に広がる H 行 W 列のマス目があり、各マスにはコマが置かれているか、何も置かれていないかのどちらかです。

マス目の状態は H 個の長さ W の文字列 S<sub>1</sub>,S<sub>2</sub>,…,S<sub>H</sub>によって表され、
S<sub>i</sub>の j 文字目が # のとき上から i 行目かつ左から j 列目のマスにはコマが置かれていることを、
S<sub>i</sub>の j 文字目が . のとき上から i 行目かつ左から j 列目のマスには何も置かれていないことを表しています。

マス目上のマスのうち、コマが置かれているようなものの個数を求めてください。

#### 制約
- 1 ≤ H,W ≤ 10
- H,Wは整数
- S<sub>i</sub>は **「#」** と **「.」** のみからなる長さWの文字列

### 4-1-2. 入力形式
H W
S<sub>1</sub>
S<sub>1</sub>​
 ⋮
S<sub>H</sub>

### 4-1-3. 解説
単純に、入力文字列の中の **「#」** の個数を数え上げれば良いです。

### 4-1-4. ソースコード
~~~python
h,w = map(int,input().split())

ans = 0
for _ in range(h):
  ans += input().count('#')

print(ans)
~~~

### 4-1-5. python文法の整理
**該当要素の個数を数える count()**
pythonでは、複数の要素をまとめて扱うことができる型を、 **コレクション** と言います。
その中でも、要素をインデックスの添字で参照できるものを **シーケンス型** と言い、以下が該当します。
- リスト（list）
- タプル（tuple)
- 文字列(string)

そのシーケンス型の共通メソッドとして **count()** があります。

~~~python
#使用法
[シーケンス].count([該当要素])

#使用例
str = 'abcba'
print(str.count('a')) -> 2
print(str.count('c')) -> 1
~~~

## 4-2. B - Inverse Prefix Sum

### 4-2-1. 問題文
整数 N と長さ N の数列 S=(S<sub>1</sub>,…,S<sub>N</sub>) が与えられます。

長さ N の数列 A=(A<sub>1</sub>,…,A<sub>N</sub>) であって、k=1,…,N の全てについて以下の条件を満たすものを求めてください。
- A<sub>1</sub> + A<sub>2</sub> + … + A<sub>k</sub> = S<sub>k</sub>​ 

なお、このような数列 A は必ず存在し、一意に定まります。

#### 制約
- 1 ≤ N ≤ 10
- -10<sup>9</sup> ≤ S<sub>i</sub> ≤ 10<sup>9</sup>
- 入力は全て整数である

### 4-2-2. 入力形式
N
S<sub>1</sub> ... S<sub>N</sub>

### 4-2-3. 解説
入力例1と出力例1を眺めると、法則性に気づくと思います。
**入力例1**
3
3 4 8

**出力例1**
3 1 4

**法則性**
S = (3, 4, 8)
A = (3, 1, 4)
とすると、以下の法則が成り立っています。

A<sub>1</sub> = S<sub>1</sub>
A<sub>2</sub> = 1 = S<sub>2</sub> - S<sub>1</sub>
A<sub>3</sub> = 4 = S<sub>3</sub> - S<sub>2</sub>

つまり、一般化すると、
A<sub>n</sub> = S<sub>n</sub> - S<sub>n-1</sub>


### 4-2-4. ソースコード
~~~python
n = int(input())
s = list(map(int,input().split()))
ans = [s[0]]

for i in range(1,n):
  ans.append(s[i]-s[i-1])

print(*ans)
~~~

### 4-2-5. python文法の整理
**配列の最大値を検索 max()**

~~~python
#使用法
max([配列オブジェクト])
~~~

## 4-3. C - Extra Character

### 4-3-1. 問題文
文字列 S,T が与えられます。S は英小文字からなり、T は S に英小文字を 1 つ挿入して作られたことがわかっています。

挿入された文字は T の先頭から何番目の文字であるか求めてください。
複数の候補が考えられる場合はいずれか 1 つを求めてください。

#### 制約
- 1 ≤ |S| ≤ 5 × 10<sup>5</sup>
- Sは英小文字からなる
- TはSに英小文字を1つ挿入して作られた文字列である

### 4-3-2. 入力形式
S
T

### 4-3-3. 解説
入出力例1と2を眺めて考察していきます。
**入力例1**
~~~
atcoder
atcorder
~~~

**出力例1**
~~~
5
~~~

**入力例2**
~~~
million
milllion
~~~

**出力例1**
~~~
5
※3,4,5のいずれかで正解
~~~

**考察結果**
SとTに対して単純に、左から1文字ずつ比較していって、等しくない文字が出現した位置を出力すれば良さそうです。
ただし一点注意が必要で、Sの一番右側に文字が挿入されるケースでは特別な考慮が必要です。
※入出力例には無いので、より注意が必要

### 4-3-4. ソースコード
~~~python
s = input()
t = input()

for i in range(len(s)):
  if s[i] != t[i]:
    print(i+1)
    break
  if i == len(s)-1:
    print(len(t))
    break
~~~