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
であればi
とj
を入れ替えます。
# 操作を格納するリスト
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)