atcoder復習
下記にatcoderで解いたB問題を記載します。
勉強の記録として残します。是非参考にしてください。
解いた問題一覧
1.問題①
B - Longest Uncommon Prefix(Difficulty108)
解答
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の値を出力する
2.問題②
B - Sandwich Number(Difficulty66)
解答
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')
解法
最初の文字と最後の文字が大文字かどうかを確認する。
それ以外の文字をスライスで受け取り変数に代入する。
①代入した変数の先頭が0かどうかを確認して0だった場合はflgをFalseにする。
②変数に文字がないかを確認する。文字があった場合はflgをFalseにする。
上記①と②に当てはまらない場合に代入した変数をint型に変換する。
その数値が10000以上かつ999999以下なのかを確認する。その条件に当てはまらない場合はflgをFalseにする。
最終的にflgの条件によって文字列を表示する。
3.問題③
B - Inverse Prefix Sum(Difficulty22)
解答
n = int(input())
n_lst = list(map(int, input().split()))
ans = []
cnt = 0
for i in n_lst:
if cnt == 0:
ans.append(i)
cnt += 1
continue
ans_1 = i - n_lst[cnt - 1]
cnt += 1
ans.append(ans_1)
print(*ans)
解法
配列で入力を受け取る。
[a, b, c, d]
一番最初の要素(a)はそのままansの配列にセットする。
その次の要素(b)から下記の操作を行う。
配列にセットしている前の要素(a)と次の要素(b)を引いてその値をansの配列にセットする。
この場合だとansの配列には下記の要素をセットする。
ans = [a, (a-b), (b-c), (c-d)]
4. 問題④
- B - Yellow and Red Card(Difficulty39)
解答
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)
解法
番号によって行う操作を変えるようにする。
1の場合は配列に1を加算
2の場合は配列に2を加算
3の場合は配列の相曽が2以上なのかを確認して2以上だった場合はYesを出力
それ以外の場合はNoを出力する。