問題
問題文
$4$ 桁の暗証番号 $X_1 X_2 X_3 X_4$ が与えられます。番号は先頭の桁が $0$ であることもあり得ます。暗証番号は以下のいずれかの条件をみたすとき弱い暗証番号と呼ばれます。
・$4$ 桁とも同じ数字である。
・$1 \le i \le 3$ をみたす任意の整数 $i$ について、$X_{i+1}$ が、$X_i$ の次の数字である。 ただし、$0 \le j \le 8$ について $j$ の次の数字は $j+1$ であり、$9$ の次の数字は $0$ である。
与えられた暗証番号が弱い暗証番号ならば Weak を、そうでないならば Strong を出力してください。
制約
・$0 \le X_1,X_2,X_3,X_4 \le 9$
・$X_1,X_2,X_3,X_4$ は整数である。
回答
回答1 (AC)
弱いパスワードには 2 種類あり、1 種類目は $4$ 桁とも同じ数字である 0000, 1111, 2222, 3333, 4444, 5555, 6666, 7777, 8888, 9999 の10通り、2 種類目は $4$ 桁が連続した数字である 0123, 1234, 2345, 3456, 4567, 5678, 6789, 7890, 8901, 9012 の10通りです。弱いパスワードの個数がそれなりに少ないので、直接判定することが可能です。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
string x;
cin >> x;
string answer = "Strong";
if ( x=="0000" || x=="1111" || x=="2222" || x=="3333" || x=="4444"
|| x=="5555" || x=="6666" || x=="7777" || x=="8888" || x=="9999"
|| x=="0123" || x=="1234" || x=="2345" || x=="3456" || x=="4567"
|| x=="5678" || x=="6789" || x=="7890" || x=="8901" || x=="9012" ) {
answer = "Weak";
}
cout << answer << endl;
}
回答2 (AC)
回答1のアプローチでは弱いパスワードの個数がもっと多い場合に対応できないので、if 文の判定を数式で表現してみます。パスワードの各桁の数字 x1, x2, x3, x4 に対し、1 種類目の弱いパスワード判定は簡単で、全ての桁が等しいかを確認すれば良いです。2 種類目の弱いパスワード判定は少し工夫が必要で、x2=(x1+1)%10 のように10で割った余りを考慮すれば良いでしょう。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
int pw, x1, x2 ,x3, x4;
cin >> pw;
x4 = pw%10;
x3 = (pw/10)%10;
x2 = (pw/100)%10;
x1 = pw/1000;
string answer = "Strong";
if ( x1==x2 && x2==x3 && x3==x4 ) {
answer = "Weak";
} else if ( (x1+1)%10==x2 && (x2+1)%10==x3 && (x3+1)%10==x4 ) {
answer = "Weak";
}
cout << answer << endl;
}
調べたこと
AtCoder の解説 → 公式解説
回答2と同じ方針でしたが、回答1についても言及されていました。
AtCoder の解説 → [ユーザ解説](https://blog.hamayanhamayan.com/entry/2021/08/01/011855
)
回答2と同じ方針でした。
リンク
前後の記事
- 前の記事 → AtCoderログ:0051 - ABC 156 B
- 次の記事 → AtCoderログ:0053 - ABC 088 B