「AtCoder Beginner Contest 351 – AtCoder」のPythonの解説です。
A – The bottom of the ninth
差分を出すだけ。
Python
A = list(map(int, input().split()))
B = list(map(int, input().split()))
print(sum(A)-sum(B)+1)
B – Spot the Difference
素直に二重for文でループし、異なっている箇所を割り出しました。
Python
N = int(input()) # 数値の入力
A = [input() for i in range(N)] # N回繰り返し配列
B = [input() for i in range(N)] # N回繰り返し配列
for i in range(len(A)):
for j in range(len(A[i])):
if A[i][j] != B[i][j]:
print(i+1,j+1)
exit()
C – Merge the balls
この問題は、以下の手順で解いています。
- ボールの個数Nとボールの大きさを表す配列Aを入力として受け取ります。
- 空の配列rowを初期化します。これはボールの列を表します。
- solve関数を定義します。この関数は、与えられたボールの列に対して、問題文で述べられた操作を行います。
- 列にボールが1つ以下の場合、操作を終了します。
- 右から1番目と2番目のボールの大きさが等しい場合、1番目のボールを取り除き、2番目のボールの大きさを1増やします(2つのボールの大きさの和に相当)。
- 右から1番目と2番目のボールの大きさが異なる場合、操作を終了します。
- N回の操作を行います。
- i番目のボールを列の右端に追加します。
- 列にボールが1つの場合、次の操作へ進みます。
- solve関数を呼び出して、現在の列に対して操作を行い、結果を更新します。
- 最終的な列のボールの数を出力します。
この解法では、各操作において列の右端のボールを比較し、必要な場合は結合を行います。
最終的に残ったボールの数が答えとなります。
Python
N = int(input()) # ボールの個数Nを整数として入力
A = list(map(int, input().split())) # ボールの大きさを表す配列Aを入力
row = [] # ボールの列を表す配列rowを初期化
def solve(row):
while True:
if len(row) == 1: # 列にボールが1つ以下なら操作を終了
break
if row[-1] == row[-2]: # 右から1番目と2番目のボールの大きさが等しい場合
row.pop() # 右から1番目のボールを取り除く
row[-1]+=1 # 右から2番目のボールの大きさを1増やす(2つのボールの大きさの和に相当)
else:
break # 右から1番目と2番目のボールの大きさが異なる場合、操作を終了
return row # 操作後のボールの列を返す
for i in range(N):
row.append(A[i]) # i番目のボールを列の右端に追加
if len(row) == 1: # 列にボールが1つなら次の操作へ
continue
row = solve(row) # 列に対して操作を行い、結果を更新
print(len(row)) # 最終的な列のボールの数を出力
D – Grid and Magnet
※未だ解答していません
E – Jump Distance Sum
※未だ解答していません
F – Double Sum
※未だ解答していません
G – Hash on Tree
※未だ解答していません
まとめ
この記事では、「AtCoder Beginner Contest 351」のA問題からC問題までをPythonで解説しました。
- A問題は、差分を出すだけの簡単な問題でした。
- B問題は、二重for文を使って異なる箇所を割り出す問題でした。
- C問題は、ボールの列に対して特定の操作を行い、最終的な列のボールの数を求める問題でした。再帰関数を使ってシンプルに実装できました。
D問題で躓き、コンテストの結果は500点でした。
D問題以降はまだ解答していませんが、今後挑戦していきたいと思います。
今回のコンテストを通して、問題文をしっかり読み解くことの重要性と、再帰関数の使い方について学ぶことができました。
また、まだ解けていない問題があるので、今後も継続的に学習し、問題解決能力を高めていきたいです。