問題
問題文
$4$ つの文字列 $S_1,S_2,S_3,S_4$ が与えられます。
この中に、H , 2B , 3B , HR がそれぞれ $1$ つずつあるか判定してください。
ただし、全ての $S_i$ は H , 2B , 3B , HR のいずれかと一致します。
制約
・$S_i$ は H , 2B , 3B , HR のいずれかと一致する
回答
回答1 (AC)
4つの文字列 s.at(0), s.at(1), s.at(2), s.at(3) に H, 2B, 3B, HR がそれぞれ 1 つずつあるための条件は、全ての文字列が異なっていること、つまり s.at(0)!=s.at(1) かつ s.at(0)!=s.at(2) かつ s.at(0)!=s.at(3) かつ s.at(1)!=s.at(2) かつ s.at(1)!=s.at(3) かつ s.at(2)!=s.at(3) が成立することです。これを書き下したコードは以下のようになります。
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<string> s(4);
for ( int i=0; i<4; i++ ) {
cin >> s.at(i);
}
if ( s.at(0)!=s.at(1) && s.at(0)!=s.at(2) && s.at(0)!=s.at(3) &&
s.at(1)!=s.at(2) && s.at(1)!=s.at(3) && s.at(2)!=s.at(3) ) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
回答2 (AC)
重複の可能性がある要素の(個数ではなく)種類の数をカウントする場合には、set 型変数を使うのが便利です。set 型変数 result を用意して文字列を追加し、その要素数が 4 ならば全ての要素が異なっていることがわかります。コードは以下のようになりました。
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
set<string> result;
for ( int i=0; i<4; i++ ) {
cin >> s;
result.insert(s);
}
if ( (int)result.size()==4 ) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
調べたこと
AtCoder の解説 → 公式解説
回答1と同じ方針でしたが、全ての条件を書き下さず、for 文を使って処理していました。
リンク
- 前の記事 → AtCoderログ:0037 - ABC 105 B