はまやんはまやんはまやん

hamayanhamayan's blog

Weak Password [AtCoder Beginner Contest 212 B]

https://atcoder.jp/contests/abc212/tasks/abc212_b

解説

https://atcoder.jp/contests/abc212/submissions/24695908

問題で言われている条件をそれぞれ判定して実装しよう。

入力が数として与えられるので整数型で保持したくなるが、
今回の問題では桁に分けて条件を判定していくので、各桁毎に分けて自分は実装している。
こういう数を桁ごとに分ける場合はstringで取得してみるのもよい選択肢となる。
その後、数の配列に改めて変換していて、文字を数に変換する場合は標準関数を使ってもよいし、'0'で引くことでも実現できる。

条件1

こちらはすべて等しいかどうかの判定であるが、隣接しているもの同士が等しいことを判定すれば、
A=BかつB=CならばA=Cとなるので、全部等しいことが判定できる。

条件2

X[i]+1==X[i+1]であることを判定すればいいのだが、9の次が0になる部分が少し厄介。
これは10で周期をもつという風に言い換えることができ、計算的には10で割った余りとすればよい。
よって、(X[i]+1)%10 == X[i+1]であることを判定しよう。

string _X;
int X[4];
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> _X;
    rep(i, 0, 4) X[i] = _X[i] - '0';

    // rule 1
    if (X[0] == X[1] && X[1] == X[2] && X[2] == X[3]) {
        cout << "Weak" << endl;
        return;
    }

    // rule 2
    bool cmp01 = ((X[0] + 1) % 10) == X[1];
    bool cmp12 = ((X[1] + 1) % 10) == X[2];
    bool cmp23 = ((X[2] + 1) % 10) == X[3];
    if (cmp01 && cmp12 && cmp23) {
        cout << "Weak" << endl;
        return;
    }

    cout << "Strong" << endl;
}