AtCoder ABC 025 B – 双子とスイカ割り Python解説

スポンサーリンク

双子とスイカ割り

今回の問題はこちらから「双子とスイカ割り」。移動方向のEast、Westが与えられること。また、直大くんは 1 回の移動において A メートルよりも少ない距離を移動することと、B メートルよりも多い距離を移動することが苦手なことに気を付けて解いていきましょう。

n, a, b = map(int, input().split())

cnt = 0

for i in range(n):
    s, d = input().split()
    d = int(d)
    if d < a:
        if s == "East":
            cnt += a
        else:
            cnt -= a
    
    elif a <= d and d <= b:
        if s == "East":
            cnt += d
        else:
            cnt -= d
    
    elif d > b:
        if s == "East":
            cnt += b
        else:
            cnt -= b
            
if cnt > 0:
    print("East", cnt)

elif cnt == 0:
    print(0)

else:
    print("West", abs(cnt))

上記のコードでは、if文で移動距離の大きさ比較、続くif文で移動方向の場合分けをしています。移動方向がWestの場合は負の値を足していて、最後に距離の合計cntが正の値か負の値かで直大がいる位置をもとめています。

n, a, b = map(int, input().split())

cnt = 0

for i in range(n):
    s, d = input().split()
    # *1
    d = min(b, max(int(d), a))
    
    if s == "East":
        cnt += d
    else:
        cnt -= d
            
if cnt > 0:
    print("East", cnt)

elif cnt == 0:
    print(0)

else:
    print("West", abs(cnt))
        

元のコードとほぼ一緒ですが、(*1)ここをmax関数とmin関数を使うことで、元のコードにあるif文での移動距離の場合分けの処理を書かずに済んでいます。