PR

【Python】AtCoder Beginner Contest 351 【Cまで解説】

競プロ

AtCoder Beginner Contest 351 – AtCoder」のPythonの解説です。

WordPressブロガーの方必見! 外出先でもブログ執筆作業がはかどる、 Ankerの大容量モバイルバッテリー をご紹介します。

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

この問題は、以下の手順で解いています。

  1. ボールの個数Nとボールの大きさを表す配列Aを入力として受け取ります。
  2. 空の配列rowを初期化します。これはボールの列を表します。
  3. solve関数を定義します。この関数は、与えられたボールの列に対して、問題文で述べられた操作を行います。
    • 列にボールが1つ以下の場合、操作を終了します。
    • 右から1番目と2番目のボールの大きさが等しい場合、1番目のボールを取り除き、2番目のボールの大きさを1増やします(2つのボールの大きさの和に相当)。
    • 右から1番目と2番目のボールの大きさが異なる場合、操作を終了します。
  4. N回の操作を行います。
    • i番目のボールを列の右端に追加します。
    • 列にボールが1つの場合、次の操作へ進みます。
    • solve関数を呼び出して、現在の列に対して操作を行い、結果を更新します。
  5. 最終的な列のボールの数を出力します。

この解法では、各操作において列の右端のボールを比較し、必要な場合は結合を行います。
最終的に残ったボールの数が答えとなります。

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問題以降はまだ解答していませんが、今後挑戦していきたいと思います。

今回のコンテストを通して、問題文をしっかり読み解くことの重要性と、再帰関数の使い方について学ぶことができました。
また、まだ解けていない問題があるので、今後も継続的に学習し、問題解決能力を高めていきたいです。

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