AtCoder初心者 DailyTrainingメモ①

# ABC279 C-問題
https://atcoder.jp/contests/adt_easy_20231017_2/tasks/abc279_c 

**問題文**
![279C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547298/377b7979-6a75-af68-7414-12f3a6e2f959.png)

**ポイント**
リストの縦横を入れ替える 
→  [i for i in zip(*S)]   zip の *演算子を使って各要素の先頭からまとめなおす

````Python:279C.py
入力例
3 4
##.#
##..
#...
.###
..##
...#

H, W = map(int,input().split())

S=[]
for i in range(H):
    s=list(input())
    S.append(s)
# リスト形式で各行の文字を格納する
# 入力例　S = [['#', '#', '.', '#'], ['#', '#', '.', '.'], ['#', '.', '.', '.']]

S2=[i for i in zip(*S)]
# zip(*S)  * 演算子を使ってリストSの要素を1番目の固まり、2番目の固まり、と順番にまとめる　
# S2 = [('#', '#', '#'), ('#', '#', '.'), ('.', '.', '.'), ('#', '.', '.')]

S2.sort() # ソート
# S2 = [('#', '#', '#'), ('#', '#', '.'), ('#', '.', '.'), ('.', '.', '.')]

T=[]    # Tも同様に処理してソート
for i in range(H):
    t=list(input())
    T.append(t)

T2=[i for i in zip(*T)]
T2.sort()

if S2 == T2:
    print('Yes')
else:
    print('No')
````

# ABC217 B-問題
https://atcoder.jp/contests/adt_easy_20231018_1/tasks/abc217_b

**問題文**
AtCoder では現在、 ABC , ARC , AGC , AHC の 4 つのコンテストが定期的に開催されています。AtCoder で現在定期的に開催されているコンテストは S1,S2,S3とあと1 つは何ですか?

**ポイント**
・あらかじめリストを作成し、remove関数で要素を1つ1つ削除する

````Python:217B.py
CL = ["ABC","AGC","AHC","ARC"] # あらかじめリストに格納していく

# 入力例
# ARC
# AGC
# AHC

for _ in range(3):
    S = str(input())    
    CL.remove(S)    # 入力された文字を　リストから削除する

# 3つの要素が削除されたあと　CL = ["ABC"] 　となる

print(CL[0]) # リストに残ったものが答え
````

# ABC307 B-問題
https://atcoder.jp/contests/adt_easy_20231018_1/tasks/abc307_b

**問題文**
英小文字のみからなるN 個の文字列 Sが与えられます。
1 以上 N 以下の 相異なる 整数 i,j であって、SiとSjを
この順に連結した文字列が回文となるようなものが存在するか判定してください。

**ポイント**
・文字列の反転　U = T[::-1]  # Tを反転させた文字列Uを生成

````Python:307B.py
入力例
5
ab
ccef
da
a
fe

# 入力
N = int(input()) 
S = []

for _ in range(N):
    s = str(input())
    S.append(s) # リストS に格納する

for i in range(N):
    for j in range(N):
        if i != j:
            T = S[i] + S[j]
            U = T[::-1]  # Tを反転させた文字列Uを生成 (重要!!)
            if T == U:
                print("Yes")
                exit()
print("No")
````

# ABC283 C-問題
https://atcoder.jp/contests/adt_easy_20231018_1/tasks/abc283_c

**問題文**
レジの機械には、はじめ 0 が表示されています。 ボタン 00 を押すと、表示されている数が 
100 倍されます。 それ以外のボタンを押すと、表示されている数が 
10 倍されたあとに、押されたボタンに書かれている数が加算されます。
高橋君は、レジに整数 S を表示させたいです。 レジにS が表示されている状態にするためには、
少なくとも何回ボタンを押す必要があるか求めてください。

**ポイント**
・00 が連続したとき　[00]キーを使うので replace関数で1桁の文字に置換する

````Python:283C.py
入力例
40004

# 入力
S = (input()) 

# ゼロが連続するときは、[00]キーを使うので、1桁の文字列に置き換える
T = S.replace("00","A")
# 40004  →　4A04

# 置き換えた文字列 T の長さが答えになる
print(len(T))
````

# ABC272 B-問題
https://atcoder.jp/contests/adt_easy_20231017_1/tasks/abc272_b

**問題文**
1,2,…,N の番号がついた N 人の人がいます。M 回の舞踏会が行われました。
どの二人も少なくとも 1 回同じ舞踏会に参加したか判定してください。

**ポイント**
・公式 n(n-1)/2 で求めた組み合わせの数とsetに格納したペアの数を比較する

````Python:272B.py
入力例
3 3
2 1 2
2 2 3
2 1 3

# 入力  N人　M回の舞踏会が開催される
N,M = map(int,input().split())

dancepair = set()
for i in range(M):
    X = list(map(int,input().split()[1:])) # 読み込んだ入力の2カラム目からリストXに格納
    for j in range(len(X)):
        for k in range(j + 1, len(X)):
            dancepair.add((X[j],X[k]))    # set にペアを格納する

# 組み合わせの数の公式は、n(n-1) / 2
kumi = N * (N-1) // 2

# set の要素数と一致していれば、Yes
if kumi == len(dancepair):
    print("Yes")
else:
    print("No")
````