超初心者がpythonでAtcoder Problemsを114回から解いてみた【9割自分用】

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

<h1>754</h1> https://atcoder.jp/contests/abc114/tasks/abc114_b

```python:practice.py　(2)
s = input()
ans = 753
for i in range(len(s)-2):
    temp = abs(int(s[i]+s[i+1]+s[i+2])-753)
    if ans > temp:
        ans = temp
print(ans)
```

連続する３桁の整数をつながりとして抜き出して、753(753にできる限り近い数字を求めたいから)で引いた時の絶対値を最初に求めます。　次にその時点で最小の差と比べて、抜き出した値の方が753との差が小さいかった場合抜き出した値と753の差がansに入っていきます。

<h1>Christmas Eve Eve</h1> https://atcoder.jp/contests/abc115/tasks/abc115_b

```python:practice.py　(2)
n = int(input())
products = [int(input()) for _ in range(n)]
total = sum(products)
total -= (max(products)//2)
print(total)
```

最初にすべての商品の定価の合計を求め出して、その後に一番高い商品の定価を2で割った数を先に求め出した合計から引くだけで求められます！

<h1>Collatz Problem</h1> https://atcoder.jp/contests/abc116/tasks/abc116_b

```python:practice.py　(2)
s = int(input())
numbers = []
numbers.append(s)
judge = True
cnt = 1
while judge:
    cnt += 1
    if s % 2 == 0:
        s = s//2
        if s in numbers:
            print(cnt)
            exit()
        numbers.append(s)
    else:
        s = s*3+1
        if s in numbers:
            print(cnt)
            exit()
        numbers.append(s)
```

s%2==0で数字が奇数か偶数かを判定してから、それぞれに合った処理を実行します。その後にnumbersリストに既に存在している数字かを判定します。もし存在するのなら、その時のiの値を出力し、存在しないのならばnumbersリストに追加して次の数字の処理へと移ります。

<h1>Polygon</h1> https://atcoder.jp/contests/abc117/tasks/abc117_b

```python:practice.py　(2)
n = int(input())
edges = list(map(int, input().split()))
max_edge = max(edges)
edges.remove(max_edge)
if max_edge < sum(edges):
    print("Yes")
else:
    print("No")
```

問題文で定義に則って実装しました。まず、与えられた辺の中で最大のものをmax_edgeに格納して、edgesからmax_edgeを取り除きます。その後にsumメソッドでmax_edgeを抜いた後の辺の長さの合計とmax_edgeの値を比べて、結果を出力します。

<h1>Foods Loved by Everyone</h1> https://atcoder.jp/contests/abc118/tasks/abc118_b

```python:practice.py　(2)
import collections
import itertools
n,m = map(int, input().split())
numbers = itertools.chain(*[list(map(int, input().split()))[1:] for _ in range(n)])
answers = collections.Counter(numbers)
total = 0
for i in answers.values():
    if i == n:
        total += 1
print(total)
```

なんか無性にライブラリを使いまくりたくなったのでcollectionsのcounterとitertoolsのchainメソッドを使って書きました。まずcounterメソッドでそれぞれの食べ物が好きだと言われた回数を調べるために二重リスト？を一重リスト？に変換する必要がありました。そのためにitertoolsのchainメソッドを使いました。そしてcounterメソッドで回数を調べ上げた後に。counterのvaluesをfor文で回してnと同じ回数だったらtotalに1を足していくようにさせました。

<h1>Digital Gifts</h1> https://atcoder.jp/contests/abc119/tasks/abc119_b

```python:practice.py　(2)
n = int(input())
moneys = [list(input().split()) for _ in range(n)]
total = 0
for money in moneys:
    if money[1] == "JPY":
        total += int(money[0])
    else:
        total += (float(money[0]) * 380000.0)
print(total)
```

ビットコインのお年玉の場合、数値が小数になるのでfloat型に変換にして処理をしていきます！

<h1>K-th Common Divisor</h1> https://atcoder.jp/contests/abc120/tasks/abc120_b

```python:practice.py　(2)
a,b,k = map(int, input().split())
anslist = []
for i in range(1,min(a,b)+1):
    if a % i == 0:
        if b % i == 0:
            anslist.append(i)
anslist = anslist[::-1]
print(anslist[k-1])
```

aとbをどっちも割り切れる数は絶対にaかbの小さい方以下でないといけないので、1から小さい方の数の範囲でfor文を回します。そして約数を洗い出していきます。最後に大きい順にリストをソートしてk番目に大きい数字を取り出します。

<h1>Can you solve this?</h1> https://atcoder.jp/contests/abc121/tasks/abc121_b

```python:practice.py　(2)
n,m,c = map(int, input().split())
blist = list(map(int, input().split()))
alist = [list(map(int, input().split())) for _ in range(n)]
total = 0
for i in range(n):
    temp = 0
    for j in range(m):
        temp += blist[j]*alist[i][j]
    if temp + c > 0:
        total += 1
print(total)
```

全探索をルールに従って脳死でぶん回すだけです...

<h1>ATCoder</h1> https://atcoder.jp/contests/abc122/tasks/abc122_b

```python:practice.py　(2)
S = input()
acgt = ['A','C','G','T']
ans = 0
cnt = 0
for s in S:
    if s in acgt:
        cnt += 1
    else:
        ans = max(ans, cnt)
        cnt = 0
print(max(ans, cnt))
```

Sの中の文字を一文字づつ取り出していきましていきます、sがACGTのどれかであったらcntの数を１増やして、もしそうでない場合はansにcntか既存のansの値の大きい方を入れます、そしてcntの値を0にリセットします。最後のprintにもmax(ans, cnt)を入れている理由は最後の文字がACGTのどれかであったときにcntの数をansの値と比較するためです。例えばSの値がACGTのときに、この工程を忘れてしまうとansの値が0で出力されてしまいます。

<h1>Five Dishes</h1> https://atcoder.jp/contests/abc123/tasks/abc123_b

```python:practice.py　(2)
cooks = [[int(input())] for _ in range(5)]
total = 0
for i in range(5):
    temp = 10 - cooks[i][0] % 10
    if temp == 10:
        temp = 0
    cooks[i].insert(0,temp)
for i, cook in enumerate(sorted(cooks)):
    if cook[0] == 0 or i == (len(cooks)-1):
        total += cook[1]
    else:
        total += sum(cook)
print(total)
```

調理にかかる時間を一度すべて追加して、その料理が届いたあとから注文できるまでの時間を10-cooks[i][0] % 10で求め出して、リストに追加していきます。そして待ち時間が少ない順でsortして、その順番通りに注文していった結果かかる時間を出力します

<h1>Great Ocean View</h1> https://atcoder.jp/contests/abc124/tasks/abc124_b

```python:practice.py　(2)
n = int(input())
hotels = list(map(int, input().split()))
total = 0
highest = 0
for hotel in hotels:
    if hotel >= highest:
        total += 1
        highest = hotel
print(total)
```

hotelの標高がその時点で一番標高の高いホテルより以上の位置にあるのなら、totalに１を足します。そして一番高いホテルの標高をそのホテルの標高に入れ替えます。

<h1>Resale</h1> https://atcoder.jp/contests/abc125/tasks/abc125_b

```python:practice.py　(2)
n = int(input())
values = list(map(int, input().split()))
costs = list(map(int, input().split()))
results = []
for i in range(n):
    result = values[i]-costs[i]
    if result >= 0:
        results.append(result)
print(sum(results))
```

valueとcostの差を計算して、利益が出る時だけresultsリストに挿入します、そしてresultsの合計数値を出力します