超初心者がAtcoder ProblemsのB問題を99から110まで解いてみる件【10割自分用】

解き方を忘れないためにまとめてるだけなのでコードはめちゃくちゃ不細工です、ここもっと良くできるよって場所あったら教えていただけるとありがたいです！！

<h1>Cut and Count</h1> https://atcoder.jp/contests/abc098/tasks/abc098_b

```python:practice.py
n = int(input())
s = input()
ans = 0
for i in range(1,n):
    cnt = len(set(s[:i])&set(s[i:]))
    ans = max(ans, cnt)
print(ans)
```

まず、すべての切れる場所を全探索してset型にして重複を消す。次にどっちともにも共通する要素の数をlen(set(s[:i])&set(s[i:]))で調べ上げて、最大の数が入るようにmaxメソッドで比較し続ける

<h1>Stone Monument</h1> https://atcoder.jp/contests/abc099/tasks/abc099_b

```python:practice.py
a,b = map(int, input().split())
temp = b-a
cnt = 0
for i in range(temp+1):
    cnt += i
print(cnt-b)
```

bの数字からaの数字を引くと1+2+3...+NのNの数字が取得できるので、N+1回for文で足し算し続ければギリギリ埋まっていない塔の高さがわかるので、それからbを引いたら答えが出てきます！

<h1>Ringo's Favorite Numbers</h1> https://atcoder.jp/contests/abc100/tasks/abc100_b

```python:practice.py
d,n = map(int, input().split())
print((100**d)*n if n != 100 else (100**d)*(n+1))
```

この問題コーナケースというものがあるらしく、nが100の時はうまく成り立たなくなるので、nに１を加えてから計算するらしいです。
ここで詳しい解説がされてます、c++コードですが考え方の問題なのでコードはあんまし関係ないです。
https://blog.hamayanhamayan.com/entry/2018/06/17/100130

<h1>Digit Sums</h1> https://atcoder.jp/contests/abc101/tasks/abc101_b

```python:practice.py
n = input()
s = 0
for i in range(len(n)):
    s += int(n[i])
if int(n) % s == 0:
    print("Yes")
else:
    print("No")
```

sを楽に作りたいのでstr型で入力を受け取って、sをまず作ります。その後に受け取った値をint型に変換してsで割ります

<h1>Maximum Difference</h1> https://atcoder.jp/contests/abc102/tasks/abc102_b

```python:practice.py
n = int(input())
numbers = list(map(int, input().split()))
print(max(numbers) - min(numbers))
```

2要素の差の最大値ということはリストの中の最大の値をmaxメソッドで見つけ出して、最小の値(minで見つけ出せる)で引くだけです。

<h1>String Rotation</h1> https://atcoder.jp/contests/abc103/tasks/abc103_b

```python:practice.py
s = input()
t = input()
if s == t:
    print("Yes")
    exit()
for i in range(len(t)):
    first = t[:i]
    second = t[i:]
    if (second+first) == s:
        print("Yes")
        exit()
print("No")
```

tを入れ替えてできる文字列を全探索して、一致するか判定するだけ！

<h1>AcCepted</h1> https://atcoder.jp/contests/abc104/tasks/abc104_b

```python:practice.py
s = input()
judge = True
if s[0] != "A":
    print("WA")
    exit()
if s[2:-1].count("C") != 1:
    print("WA")
    exit()
s = s.replace("A","").replace("C","")
if not s.islower():
    print("WA")
    exit()
print("AC")
```

AとCの判定をした後に、sからAとCを取り除いて、残った文字列が完全に小文字で構成されてるかを確認しています。一つでも引っ掛かったらWAが出る仕組みです

<h1>Cakes and Donuts</h1> https://atcoder.jp/contests/abc105/tasks/abc105_b

```python:practice.py
n = int(input())
for i in range(n):
    for j in range(n):
        if (4*i) + (7*j) == n:
            print("Yes")
            exit()
print("No")
```

単純に全探索を回すだけです。　すごい雑ですんません...

<h1>105</h1> https://atcoder.jp/contests/abc106/tasks/abc106_b

```python:practice.py
n = int(input())
ans = 0
for i in range(1,n+1,2):
    cnt = 0
    for j in range(1,i+1):
        if i % j == 0:
            cnt += 1
    if cnt == 8:
        ans += 1
print(ans)
```

1からN+1の範囲内の奇数をiにぶち込んでfor文を回して、約数の数を判定するために、1からi+1の範囲で２個目のfor文を回して、約数が８個かどうかを調べ上げる

<h1>Grid Compression</h1> https://atcoder.jp/contests/abc107/tasks/abc107_b

```python:practice.py
h,w = map(int, input().split())
a = []
b = []
c = []
for i in range(h):
    s_line = list(input())
    if "#" in s_line:
        a.append(s_line)
for i in range(w):
    temp_list = []
    for j in range(len(a)):
        temp_list.append(a[j][i])
    if "#" in temp_list:
        b.append(temp_list)
for i in range(len(a)):
    supportlist = []
    for j in range(len(b)):
        supportlist.append(b[j][i])
    c.append(supportlist)
for c_line in c:
    print(''.join(c_line))
```

ACしてる人の出力見てしもうたよ、むずかったわ...解釈としてはまず横一列すべて"."の要素をすべて取り除く。　そして次に親forをwで回すことによって縦一列すべて"."の要素を取り除く。最後に入力と同じような形に戻すためにもう一度for文を回す。supportlist.append(b[j][i])でjが先になっているのはbでは縦列が基本になっているから。

<h1>Ruined Square</h1> https://atcoder.jp/contests/abc108/tasks/abc108_b

```python:practice.py
x1,y1,x2,y2 = map(int, input().split())
xlength = x2 - x1
ylength = y2 - y1
x3 = x2 - ylength
y3 = y2 + xlength
x4 = x1 - ylength
y4 = y1 + xlength
print(x3, y3, x4, y4)
```

この問題は一回図を書いてみると凄い簡単に理解できて、何をやればいいかが分かります！

<h1>Shiritori</h1> https://atcoder.jp/contests/abc109/tasks/abc109_b

```python:practice.py
n = int(input())
words = [input() for _ in range(n)]
for i in range(1,n):
    if words.count(words[i]) >= 2:
        print("No") 
        exit()
    else:
        if words[i][0] != words[i-1][-1]:
            print("No")
            exit()
print("Yes")
```

一度すべての単語をリストに格納してから、確認していきました、for文が1からnなのは最初の単語がひっかることは絶対にないのと、elseに行ったあとの処理でエラーが出てしまうからです。

<h1>1 Dimensional World's Tale</h1> https://atcoder.jp/contests/abc110/tasks/abc110_b

```python:practice.py
n,m,x,y = map(int, input().split())
xlist = list(map(int, input().split()))
ylist = list(map(int, input().split()))
for i in range(x+1,y+1):
    judge = True
    for xnum in xlist:
        if i <= xnum:
            judge = False
            break
    for ynum in ylist:
        if i > ynum:
            judge = False
            break
    if judge:
        print("No War")
        exit()
print("War")
```

考えられるzの値を全探索します、すべてのif文センサーを通り抜けられたzが存在するときに"No War"を表示してプログラムをexitメソッドで終了します、もしzの値がなんであってもwarになってしまう場合は"war"を表示します