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")
コメント