ABC267 B問題 Split?【C++, python】

ABC267のB問題 Split? の解説をしています。
ポイント1: 各列にピンが1本以上立っているかどうかの情報を管理する

私は以下のように文字列colsに’o’か’x’を入れて管理するようにしました。

\( i \) 列目に1本以上のピンが立っている場合には’o’を、そうでない場合には’x’で表す

例えば、cols = “oxooxox”みたいな形になります。

ポイント2: splitの状態であるかどうかを判定する
まず最初に先頭のピンが立っている(文字列が’1’)であれば、splitではありません。
最初に判定して、returnしておくのが良いかと思います。

ポイント1で作成した文字列colsを元にsplitとなるかを判定します。

‘o’と’o’の間に’x’が存在すればsplitになります。(’o’の後に”xo”が来る)

“oxooooo”
“oxxoooo”
“oxxxooo”

みたいな形であればsplitです。
が、コードに落とし込みにくいので、下記のような工夫をします。

文字列colsの先頭に’x’を仕込んでおく

この工夫をすると、“xo”の後に”xo”が来たらsplitと判定ができるようになります。
さらに言い換えると、”xo”が2回以上出現すれば、splitと判定ができそうですね!

あとはコードにしていきます。

C++での回答例

#include<bits/stdc++.h>
using namespace std;
using P = pair<int, int>;
#define rep(i, n) for (int i = 0; i < (n); ++i)

int main() {
    string s;
    cin >> s;
    
    if (s[0] == '1') {  // 先頭のピンが立っていれば、splitでない
        cout << "No" << endl;
        return 0;
    }

    string cols = "x";  // 各列に立っているピンが存在するかどうかを管理する文字列、先頭には'x'を仕込んでおく。

    if (s[6] == '1') cols += "o"; else cols += "x";
    if (s[3] == '1') cols += "o"; else cols += "x";
    if (s[1] == '1' || s[7] == '1') cols += "o"; else cols += "x";
    if (s[0] == '1' || s[4] == '1') cols += "o"; else cols += "x";
    if (s[2] == '1' || s[8] == '1') cols += "o"; else cols += "x";
    if (s[5] == '1') cols += "o"; else cols += "x";
    if (s[9] == '1') cols += "o"; else cols += "x";

    int cnt = 0;    // "xo"が出現する回数を管理する変数
    rep(i, 7) {
        if (cols[i] == 'x' && cols[i+1] == 'o') cnt++;
    }

    if (cnt >= 2) {
        cout << "Yes" << endl;
        return 0;
    }
    cout << "No" << endl;
    return 0;
}

Pythonでの回答例

s = input()

cols = "x"  # 各列に立っているピンが存在するかどうかを管理する文字列、先頭には'x'を仕込んでおく。 

cols += 'o' if s[6] == '1' else 'x'
cols += 'o' if s[4] == '1' else 'x'
cols += 'o' if s[1] == '1' or s[7] == '1' else 'x'
cols += 'o' if s[0] == '1' or s[4] == '1' else 'x'
cols += 'o' if s[2] == '1' or s[8] == '1' else 'x'
cols += 'o' if s[5] == '1' else 'x'
cols += 'o' if s[9] == '1' else 'x'

cnt = 0     # "xo"が出現する回数を管理する変数
for i in range(len(cols) - 1):
    if cols[i] == 'x' and cols[i+1] == 'o':
        cnt += 1

ans = False
ans = True if cnt >= 2 else False
if s[0] == '1':     # 先頭のピンが立っていれば、splitではない
    ans = False

print("Yes") if ans else print("No")

 

コメント