[Python]AtCoder Beginner Contest 160を解いてみた(A~C)

プログラミング

AtCoder Beginner Contest 160(ABC 160)にPythonで参加しました。A~C問題まで解けました。

A – Coffee

問題

ある長さ6の英小文字からなる文字列がcoffeeに似ているとは、3文字目と4文字目が等しく、5文字目と6文字目も等しいことを言います。
与えられる文字列Sがcoffeeに似ているか判定してください。

自分の回答

s = input()

if s[2] == s[3] and s[4] == s[5]:
  print("Yes")
else:
  print("No")

問題文の通りですね。3文字目と4文字目(s[2] == s[3])が等しく、かつ、5文字目と6文字目(s[4] == s[5])も等しい時に、”Yes”と出力します。

B – Golden Coins

問題

高橋君は金色の硬貨が好きです。自分が持っている500円硬貨1枚につき1000、5円硬貨1枚につき5の嬉しさを得ます。
高橋君はX円を持っています。これを高橋君の嬉しさが最大になるように両替したとき、高橋君の嬉しさはいくらになりますか?
(なお、利用できる硬貨は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉の6種類とします。)

自分の回答

X = int(input())
# 500玉の枚数を求める
num_500 = int(X / 500)
# 残高を求める
amari = X - (500 * num_500)
# 5円玉の枚数を求める
num_5 = int(amari / 5)
 
print(num_500 * 1000 + num_5 * 5)

利用できる硬貨は6種類とありますが、問題となるのは、500円玉と5円玉の枚数のみなので、この2種類だけ注目すればいいです。
まずは、入力された値(X)を500で割って、500円玉の枚数(num_500)を求めます。枚数を求める時に、int型にすることに気をつけましょう。
次に、500円玉で払う分を除いた残高(amari)を求めます。
そして、残高を5で割ることで、5円玉の枚数(num_5)を求めます。
最後に、嬉しさを求めれば答えとなります。

C – Traveling Salesman around Lake

問題

1周Kメートルの円形の湖があり、その周りにN軒の家があります。
i番目の家は、湖の北端から時計回りにAiメートルの位置にあります。
家の間の移動は、湖の周りに沿ってのみ行えます。
いずれかの家から出発してN軒すべての家を訪ねるための最短移動距離を求めてください。

自分の回答

K, N = map(int, input().split())
house = list(map(int,input().split()))
min = house[N - 1] - house[0]
 
for i in range(N - 1):
  if K - (house[i + 1] - house[i]) < min:
    min = K - (house[i + 1] - house[i])
 
print(min)

難しかったです。でも、何とか解けてよかったです。他の方の回答を見たのですが、少し違った形になっているので、あしからず。

まずは、リスト(house)に入力された値を格納しています。
そして、家の間の距離の最小値の初期値(min)をhouse[N – 1] – house[0]としています。これは入力された家の距離の最初と最後の値の差になっています。もし、家が直線に並んでいるのであれば、ここで終わりなのですが、家は円形の池の周りに建っているため、そう簡単にはいきません。問題文の入出力例にもあるように、途中の家から出発して、0m地点を通ることを考慮しなければなりません。
if文の中で、K – (house[i + 1] – house[i])としています。隣り合う家の距離(house[i + 1] – house[i])を湖の円周(K)から引けば、すべての家を訪ねた移動距離になります。この値が一番小さくなる時の値が答えとなります。

感想

C問題が手強かったです。しかし、時間はかかっても解けたのは良いことだと思いました。しかし、D問題を見たのですが、何をしているのか全くわかりませんでした。D問題を解けるようになるには、本格的な対策が必要なのではないかと感じました。しかし、まだC問題も解ける時と解けない時があるので、まずは、C問題までをきちんと解ける実力を付けていこうと思います。

タイトルとURLをコピーしました