atcoder復習
下記にatcoderで解いたB問題を記載します。
勉強の記録として残します。是非参考にしてください。
解いた問題一覧
目次
1.問題①
B - Playing Cards Validation(Difficulty65)
解答
n = int(input())
n_lst = ['H', 'D', 'C', 'S']
n_lst_1 = ['A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K']
n_lst_2 = [] # 入力したデータを格納する
flg = True
for _ in range(n):
n_1 = input()
n_lst_2.append(n_1)
if not n_1[0] in n_lst:
flg = False
if not n_1[1] in n_lst_1:
flg = False
def chk(seq):
'''重複確認'''
return len(seq) != len(set(seq))
if chk(n_lst_2):
flg = False
if flg:
print('Yes')
else:
print('No')
解法
確認するデータを配列に格納しておく。
入力をされたら配列の中にデータがあるのかを確認し存在していたらflgをFalseにする。
そして最後のif文で出力する文字を判断する。
if文、for文、配列を使用出来れば解ける問題である。
重複確認では配列をset型にして重複を無くし元の配列と長さを確認している。
長さが違うのであれば重複があるのでflgをFalseにしている。
2.問題②
B - レ(Difficulty225)
解答
N, M = map(int, input().split())
n_list = list(map(int, input().split()))
ans_list = [] # 並び替えない配列
ans_list_1 = [] # 並び替えた配列
flg_list = [True] * N
cnt = 1
for j in n_list:
flg_list[j - 1] = False # レ点の場所をチェックする。
for k in flg_list:
ans_list.append(cnt)
if k == True:
ans_list_1 += reversed(ans_list)
ans_list = []
cnt += 1
if M == 0:
for i in range(1, N+ 1):
ans_list.append(i)
print(*ans_list)
else:
print(*ans_list_1)
解法
flg_listでレ点がある場所にチェックをしている。True→Falseにする。
flg_listをfor文で回しTrueが出現したら配列を逆順にして別の配列にセットする。
逆順にした配列は空にする。
この処理をflg_listの中身を全部確認するまで行う。
最後に配列の中身を表示する。
3.問題③
B - Call the ID Number(Difficulty65)
解答
K = int(input())
k_lst = list(map(int, input().split()))
flg_lst = [0] * K
cnt = 0
ans_lst = []
for i in range(1, K + 1):
ans = k_lst[cnt]
if flg_lst[i - 1] != 1:
if not flg_lst[ans - 1] == 1:
flg_lst[ans - 1] = 1
cnt += 1
ans = flg_lst.count(0)
print(ans)
print(*[i + 1 for i, x in enumerate(flg_lst) if x == 0])
解法
flg_lstを用意して人が呼ばれた場合にチェックをする。
今回の場合は配列のデータが1になっている場合が呼ばれている。
解答として出力するのは0の個数(呼ばれていない人数)と呼ばれていない人の数
配列に格納されている0の位置を表示するには0がどこに出現しているのかをfor文で確認して表示する。