見出し画像

atcoderB問題特集

問題①

問題
入力例

解答コード

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文、配列を使用出来れば解ける問題である。

問題②

問題
入力例

解答コード

n, k = map(int, input().split())
S = input()
ans = ''
for i in S:
    if ans.count('o') < k:
        if i == 'x':
            ans += 'x'
        elif i == 'o':
            ans += 'o'
    else:
        ans += 'x'
print(ans)

解法

oだった場合は文字列にoを連結する。
xだった場合は文字列にxを連結する。
文字列に格納されているoがkの数を超えた場合は全てxにする。oの数はif文で判断する。

問題③

問題
入力例

解答コード

n, m = map(int, input().split())
ans_lst = [0] * n
output = []
for _ in range(m):
    n_1, m_1 = map(int, input().split())
    if n_1 == 1:
        ans_lst[m_1 - 1] += 1
    elif n_1 == 2:
        ans_lst[m_1 - 1] += 2
    else:
        if ans_lst[m_1 - 1] >= 2:
            ans = 'Yes'
            output.append(ans)
        else:
            ans = 'No'
            output.append(ans)
for ans_value in output:
    print(ans_value)

解法

人数分の配列を用意する。データはint型の0
イエローカード(n_1 = 1)の場合は配列のデータにインクリメントする。
レッドカード(n_2 = 2)の場合は配列のデータに2をプラスする。
n_1 = 3の場合は配列のデータを確認して2以上の場合にYesを出力する。それ以外はNoを出力する。

退場処分を受けている=2以上
退場処分を受けていない=2未満
最後はlistに格納されているデータをfor文で表示する。

問題④

問題
入力例

解答コード

n, q = map(int, input().split())
n_lst = [list(map(int, input().split()))for _ in range(n)] # 入力を二次元配列で受け取る。
ans_lst = []
for _ in range(q):
    n_1, q_1 = map(int, input().split())
    ans = n_lst[n_1 - 1][q_1] # 二次元配列にアクセスする。
    ans_lst.append(ans)

for ans_value in ans_lst:
    print(ans_value)

解法

入力を二次元配列で受け取るようにする。
for文ループして二次元配列にアクセスし要素を取得する。
取得した要素をlistに格納してfor文で表示する。

問題⑤

問題
出力例

解答コード

N = int(input())
s = input()
cnt = s.count('na')
print(s.replace('na', 'nya', cnt))

解法

naが出現する回数をcountで取得する。
取得した出現回数入力した文字を置換する。

問題⑥

問題
入力例

解答コード

N = int(input())
s = input()

for i in range(1, N):
    for j in range(N - i):
        if s[j] == s[j + i]: # j = 0とj = 1始め
            j -= 1
            break
    print(j + 1)

解法

iの範囲を広げて文字をチェックする一回目のiは1ずつ増えていく。
二回目のiは2ずつ増えていく処理になっている。
最初は五回ループする。
二回目は4回ループする
jのループ回数は1回ずつ減っていく。
iの範囲はループごとに増えていく。
s[j + i]でiの範囲を広げて文字が同じなのかを確認している。
二重for文を出たタイミングでjの値を出力する。

問題⑦

問題
問題
入力例

解答コード

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を用意してレ点がある場所にチェックをする配列を作成する。
レ点の場所が出現したらreverseして別の配列にセットをする。
セットをしたらreverceした配列は初期化をして空にする。
レ点がある箇所までは配列にセットをし続ける。
レ点がない場合は何も操作をせずに終了する。

問題⑧

問題
出力例

解答コード

S = input()
flg = True
cnt = len(S)
if not S[0].isupper():
    flg = False
if not S[-1].isupper():
    flg = False
if cnt > 2:
    ans = S[1:cnt - 1]
    if cnt > 1:
        if ans[0] == '0':
            flg = False
        elif not str.isdecimal(ans):
            flg = False
        else:
            ans_1 = int(ans)
            if not ans_1 >= 100000 and ans_1 <= 999999:
                flg = False
    else:
        flg = False
else:
    flg = False
if flg:
    print('Yes')
else:
    print('No')

解法

文字の入力を受け取り最初の文字と最後の文字が大文字なのかを確認する。
その後二文字目から最後から二番目まで文字列の数が6文字なのかを確認する。その数をint型にして100000以上で999999以下なのかを確認する。
全ての条件に一致している場合にYesを出力する。

この記事が気に入ったらサポートをしてみませんか?