AtCoder Beginner Contest 380 のB問題〜D問題をPythonで解説します。
提出コード
B問題
問題
画像の文字起こし
1区切りに-入った文字列が与えられます。
区切りごとの1の個数を求めてください。
アプローチ
画像の文字起こし
文字列を」ごとに区切ります。
区切りごとの文字数を出力します。
C問題
問題
画像の文字起こし
0と1からなる文字列があります。
K番目の1の文字列の塊をその直前の0の塊と入れ替えた文字列を出力してください。
アプローチ
画像の文字起こし
0または1ごとに区切ります。
K番目に出てくる1とその直前の要素を交換します。
D問題
問題
画像の文字起こし
文字列Sがあります。この文字列に以下の操作をQ回行った際の、
K番目の文字列を求めてください。
操作
・まず、Sの大文字を小文字に、小文字を大文字に書き換えた文字列をTとする。
・その後、SとTとをこの順に連結した文字列を新たなSとする。
最初の2文字目までは、操作前の文字列です。
3~4文字目は1~2文字目の大文字小文字を反転した文字列です。
最初の4文字目までは、操作前の文字列です。
5~8文字目は1~4文字目の大文字小文字を反転した文字列です。
アプローチ
画像の文字起こし
次の2段階で解きます。
・対象の文字を取得
・大文字小文字が反転されているかを算出
対象の文字を取得
Kを元の文字列数で割った時の余りから対象の文字を特定できます。
大文字小文字が反転されているかを算出
Kを元の文字列数で割った時の商(軽数切捨て)から算出できます。
商を2進数にした時の1の個数が偶数なら元の文字列のまま、奇数なら反転です。
反転を2進数で判定できる理由
1の個数を反転の回数としてみなせます。なので、奇によって反転かを判定できます。
5~6文字目は1~2文字目を反転した文字列が来ています。
7~8文字目は3~4文字目を反転した文字列が来ています。
つまり、元の文字列から反転が2回されているので、元の文字列が来ます。