0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Atcoder勉強記録②

Last updated at Posted at 2023-03-19

atcoder復習

下記にatcoderで解いたB問題を記載します。
勉強の記録として残します。是非参考にしてください。
解いた問題一覧

1.問題①

B - Longest Uncommon PrefixDifficulty108

解答

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 NumberDifficulty66

解答

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 SumDifficulty22

解答

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. 問題④

  1. B - Yellow and Red CardDifficulty39

解答

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を出力する。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?