見出し画像

[ABC275 Python]AtCoder Beginner Contest 275 A~C問題Python解説

ABC275の解説記事です。
ミス等ありましたらコメントにてご連絡ください。

A問題

N = int(input())
H = list(map(int, input().split()))

h = 0
ans = 0
for i in range(N):
    if H[i] > h:
        ans = i
        h = H[i]
print(ans+1)

よく出題される変数を2個保持する問題です。

まずは橋の高さを表すh
そして何番目の橋が高いのかを表すansです。

与えられたリストHの先頭から順番に見ていき、
今までの最長の橋よりも高い橋であれば、
最長の橋を更新します。

最後に何番目(インデックスなので+1)の橋が一番高いのか出力します。

B問題

A, B, C, D, E, F = map(int, input().split())

print((A*B*C-D*E*F)%998244353)

C言語等で解いている方はオーバーフローに気を付けて項を1つずつ余りを求める必要がありますが、Pythonではそのようなことはありません。

C問題

import itertools

S_sharp = set()
for i in range(9):
    S = list(input())
    for j in range(9):
        if S[j] == "#":
            S_sharp.add((i,j))

ans = 0
for i in itertools.combinations(S_sharp, 4):
    distance = set()
    for j1, j2 in itertools.combinations(i, 2):
        # print(j1,j2)
        distance.add((j1[0]-j2[0])**2+(j1[1]-j2[1])**2)
    
    if len(distance) == 2:
        ans += 1

print(ans)

(PyPy3で実行してください!)

いろいろな求め方が考えられますが、
1例として説明いたします。

プログラムの概要としては、
#の座標を保存して、
その中から4点を取ってきます。
その4点が正方形ならカウントされるという感じです。

では、プログラムを見ていきましょう。
S_sharpに#の座標を保存します。

次にS_sharpの中から考えられる4点の組み合わせを全探索します。
私のお気に入りitertools.combinations()です。

最後にこの4点が正方形を成すかどうかですが、
正方形の性質として、まず「4つの辺の長さが同じ」があります。
ただ、これだけだとひし形も含まれてしまうため、
この性質に加えて、「対角線の長さが等しい」
という性質も加えて正方形だけを判定します。

具体的にはこれも4点の中から2点を選ぶ組み合わせを全探索します。
1つの点から他の3つの点への組み合わせがありますが、
3つのうち2つは正方形の辺となるもの
残りの1つは正方形の対角線となるものになります。

判定方法としては組み合わせの種類数を数えて、
辺の長さと対角線の長さの2種類のみであれば、
正方形と判断します。
辺の長さと対角線の長さが一致することはないので、
2種類として断定できます。



いいなと思ったら応援しよう!