ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC187 A - Large Digits / B - Gentle Pairs【Python解答例】

AtCoder Beginner Contest187に出場しC問題まで解くことができました。
この記事ではAおよびB問題の解答例を書いていきます。
AtCoder Beginner Contest 187 - AtCoder


AtCoder Beginner Contest187 A - Large Digits

A - Large Digits

問題文

整数nに対して、nを十進法で表したときの各桁の和をS(n)で表すことにします。 例えば、S(123)=1+2+3=6です。
2つの3桁の整数A,Bが与えられます。
S(A)とS(B)のうち大きい方の値を求めてください。

制約

・入力は全て整数
・100≤A,B≤999

解答例

a, b = input().strip().split()

sa = 0
sb = 0

for i in range(3):
    sa += int(a[i])

for i in range(3):
    sb += int(b[i])

if sa > sb:
    print(sa)
else:
    print(sb)

解説

3桁の整数が2つ与えられ、大きいほうの各桁の和を答える問題です。

3桁の整数をstr型で受け取り、例えば整数Aの場合ではint(a[i])とすることでi桁目の数字を取り出せます。
その値を各桁の和を格納するsaに足していきます。

最後にsaとsbを比較して、大きいほうを出力すればACでした。



AtCoder Beginner Contest187 B - Gentle Pairs

B - Gentle Pairs

問題文

xy平面上に1,2,…,Nの番号が付けられたN個の点があります。点iは(xi,yi)にあり、N個の点のx座標は互いに異なります。
以下の条件を満たす整数の組(i,j)(i

制約

・入力は全て整数
・1≤N≤10^3
・|xi|,|yi|≤10^3
・i≠jならばxi≠xj

解答例

n = int(input())

X = []
Y = []
for i in range(n):
    x, y = map(int,input().split())
    X.append(x)
    Y.append(y)

ans = 0

if n > 1:
    for i in range(n-1):
        for j in  range(i+1,n):
            k = abs((Y[j] - Y[i])/(X[j] - X[i]))
            if k <= 1:
                ans += 1

print(ans)

解説

xy座標にN個の点があり、そのうち2点を通る直線の傾きが-1~1となる点の組み合わせの数を求める問題です。

条件にあう点かどうかをすべての組み合わせで試しました。
2重ループでi,jのすべての組み合わせを実行できます。
2点を結ぶ直線の傾きkは(y[j] - y[i]) / (x[j] - x[i])で求まります。
kの値は絶対値としてkが1以下なら、解答となるans変数を1増加させます。
ループが抜けたあとにansを出力すればOKでした。



今回はA,B問題とも少し時間がかかった印象です。
時間がかかるとどんどん焦ってくるので、すばやく解く力も必要ですね。

次回の記事はC問題の解答例について書いていきたいと思います。


ABC187の関連記事はこちら
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com