【AtCoder】ABC350解説(Python)

AtCoder Beginner Contest 350(Promotion of AtCoderJobs)の解説記事です。

目次

ABC350 A – Past ABCs

問題

問題文の要約は以下の通りです。

問題の要約

長さ 6 の文字列 \(S\) が与えられます。\(S\) の先頭 3 文字は ABC であり、末尾 3 文字は数字であることが保証されます。 \(S\) がABC001,ABC002,……,ABC314,ABC315,ABC317,ABC318,……,ABC348,ABC349の文字列のうちいずれかに等しいか判定せよ。

解説

文字列として大小関係を判定する。

解説

まず入力を受け取ります。

# 入力
S=input()

文字列として大小関係を判定します。 \(S\) がABC001からABC315まで、もしくはABC317からABC349までであればYesをそうでなければNoを出力します。

# 文字列として大小関係を判定する
if 'ABC001'<=S<='ABC315' or 'ABC317'<=S<='ABC349':
  print('Yes')
else:
  print('No')

解答

# 入力
S=input()

# 文字列として大小関係を判定する
if 'ABC001'<=S<='ABC315' or 'ABC317'<=S<='ABC349':
  print('Yes')
else:
  print('No')

ABC350 B – Dentist Aoki

問題

問題文の要約は以下の通りです。

問題の要約

高橋君の \(N\) 個の穴には初めに1本ずつ歯が生えています。青木君は \(Q\) 回の治療を行い、治療がある穴に対して歯があれば抜き、なければ生やします。最終的に、高橋君に生えている歯の本数を求めよ。

解説

各穴に歯が生えているかどうかをリストで管理する。

解説

まず入力を受け取ります。

# 入力
N,Q=map(int, input().split())
T=list(map(int, input().split()))

各穴に歯が生えているかどうかを表すリストteethを作成し、最初はすべての穴に歯がある状態(1)で初期化します。0-indexedのため穴0を追加します。

# 各穴に歯が生えているかどうかを表すリスト(0-indexedのため穴0を追加する)
teeth = [0]+[1 for _ in range(N)]

Q回の治療を行います。各治療では、歯があれば抜き(値を0)、歯がなければ生やします(値を1)。これは、teeth[t] = 1 - teeth[t]というコードで実現できます。

# Q回の治療を行う
for t in T:
  # 生えていれば抜き、生えていなければ生やす
  teeth[t] = 1 - teeth[t]

最終的に、高橋君に生えている歯の本数(リストの値1の合計)を求め、出力します。

# 結果を出力
print(sum(teeth))

解答

# 入力
N,Q=map(int, input().split())
T=list(map(int, input().split()))

# 各穴に歯が生えているかどうかを表すリスト(0-indexedのため穴0を追加する)
teeth = [0]+[1 for _ in range(N)]

# Q回の治療を行う
for t in T:
  # 生えていれば抜き、生えていなければ生やす
  teeth[t] = 1 - teeth[t]

# 結果を出力
print(sum(teeth))

ABC350 C – Sort

問題

問題文の要約は以下の通りです。

問題の要約

1 から \(N\) までの数字が一回ずつ現れる数列を与えられます。この数列の2つの要素を 0 回以上 \(N-1\) 回以下の回数、入れ替えることで昇順に並び替えよ。

解説

数列内の各数値の位置を記録し、前から順番に入れ替えを行う。

解説

まず入力を受け取ります。Aのインデックスは 1 から始まるので0番目の要素に0を追加して1-indexedにします。

# 入力
N = int(input())
# 0番目の要素に0を追加して1-indexedにする
A = [0] + list(map(int, input().split()))

数列Aの各要素の位置を記録する配列 pos を初期化し、要素の位置を pos に記録します。

# 各数値の位置を記録する配列
pos = [0] * (N + 1)

# 入力された数列 A の各要素の位置を pos に記録
for i in range(1, N + 1):
    pos[A[i]] = i

1 からNまでの各要素iに対して、A[i]iでないとき、正しい位置にある要素と交換します。問題文にi<jという条件があるのでi>jであればijを入れ替えます。

# 操作を格納するリスト
ans = []

# 1 から N までの各要素 i について、それが正しい位置にあるか確認し、なければ修正
for i in range(1, N + 1):
    # A[i] が i でないとき、正しい位置にある要素と交換する
    if A[i] != i:
        # A[i]の位置を取得
        j = pos[i]
        # i>jであれば入れ替える 
        if i>j:
          i,j=j,i
        # 操作を追加
        ans.append((i, j))
        # A[i] と A[j] を交換
        A[i], A[j] = A[j], A[i]
        # pos も更新
        pos[A[j]] = j
        pos[A[i]] = i

最後に操作の回数と具体的な操作の内容を出力します。

# 操作の回数と操作を出力
print(len(ans))
for a in ans:
    print(*a)

解答

# 入力
N = int(input())
# 0番目の要素に0を追加して1-indexedにする
A = [0] + list(map(int, input().split()))

# 各数値の位置を記録する配列
pos = [0] * (N + 1)

# 入力された数列 A の各要素の位置を pos に記録
for i in range(1, N + 1):
    pos[A[i]] = i

# 操作を格納するリスト
ans = []

# 1 から N までの各要素 i について、それが正しい位置にあるか確認し、なければ修正
for i in range(1, N + 1):
    # A[i] が i でないとき、正しい位置にある要素と交換する
    if A[i] != i:
        # A[i]の位置を取得
        j = pos[i]
        # i>jであれば入れ替える 
        if i>j:
          i,j=j,i
        # 操作を追加
        ans.append((i, j))
        # A[i] と A[j] を交換
        A[i], A[j] = A[j], A[i]
        # pos も更新
        pos[A[j]] = j
        pos[A[i]] = i

# 操作の回数と操作を出力
print(len(ans))
for a in ans:
    print(*a)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次