Time Limit: 2 sec / Memory Limit: 256 MB
問題文
5つの要素からなる配列が与えられます。
同じ値の要素が隣り合っているような箇所が存在するかどうかを判定してください。
存在するなら"YES"を、存在しなければ"NO"を出力してください。
この問題も以下の手順で解いてみましょう。
- ループを使わないで書く
- パターンを見つける
- ループで書き直す
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- vector<int> data(5);
- for (int i = 0; i < 5; i++) {
- cin >> data.at(i);
- }
- // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する
- // ここにプログラムを追記
- }
#include <bits/stdc++.h> using namespace std; int main() { vector<int> data(5); for (int i = 0; i < 5; i++) { cin >> data.at(i); } // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する // ここにプログラムを追記 }
制約
- は整数
入力
入力は次の形式で標準入力から与えられます。
出力
配列の隣り合う要素のうち、値が等しいものが存在するなら"YES"を、存在しなければ"NO"を出力してください。
出力の最後には改行が必要です。
ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。
入力例1Copy
5 3 3 1 4
出力例1Copy
YES
入力例2Copy
1 1 2 3 4
出力例2Copy
YES
入力例3Copy
1 2 1 2 1
出力例3Copy
NO
入力例4Copy
100 100 100 100 100
出力例4Copy
YES
ヒント
- ループを使わないで書く
- パターンを見つける
- ループで書き直す
に沿って書く場合の流れをヒントで説明します。
まずは自分で考えてみて、詰まったら見てみましょう。
ヒント1 (ループを使わないで書く)
クリックでヒントプログラムを見る
隣合っている等しい要素があるかを順番に確認します。
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- vector<int> data(5);
- for (int i = 0; i < 5; i++) {
- cin >> data.at(i);
- }
- // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する
- if (data.at(0) == data.at(1) || data.at(1) == data.at(2) || data.at(2) == data.at(3) || data.at(3) == data.at(4)) {
- cout << "YES" << endl;
- }
- else {
- cout << "NO" << endl;
- }
- }
#include <bits/stdc++.h> using namespace std; int main() { vector<int> data(5); for (int i = 0; i < 5; i++) { cin >> data.at(i); } // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する if (data.at(0) == data.at(1) || data.at(1) == data.at(2) || data.at(2) == data.at(3) || data.at(3) == data.at(4)) { cout << "YES" << endl; } else { cout << "NO" << endl; } }
ヒント2 (パターンを見つける)
クリックでヒントを見る
繰り返しのパターンを見つけます。 ヒント1のヒントプログラムでは11行目のif文の中身が同じパターンの繰り返しになっています。
if (data.at(0) == data.at(1) || data.at(1) == data.at(2) || data.at(2) == data.at(3) || data.at(3) == data.at(4)) { cout << "YES" << endl; } else { cout << "NO" << endl; }
if (data.at(0) == data.at(1) || data.at(1) == data.at(2) || data.at(2) == data.at(3) || data.at(3) == data.at(4)) { cout << "YES" << endl; } else { cout << "NO" << endl; }
このままだと直接for文に書き換えにくいので,「または」の条件を複数のif文に分解します。
また、答えがYESなのかNOなのかをbool型の変数に入れるようにします。次のプログラムではYESならtrue、NOならfalseとしています。
bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする if (data.at(0) == data.at(1)) { ans = true; } if (data.at(1) == data.at(2)) { ans = true; } if (data.at(2) == data.at(3)) { ans = true; } if (data.at(3) == data.at(4)) { ans = true; } if (ans) { cout << "YES" << endl; } else { cout << "NO" << endl; }
bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする if (data.at(0) == data.at(1)) { ans = true; } if (data.at(1) == data.at(2)) { ans = true; } if (data.at(2) == data.at(3)) { ans = true; } if (data.at(3) == data.at(4)) { ans = true; } if (ans) { cout << "YES" << endl; } else { cout << "NO" << endl; }
次のパターンが繰り返し存在していることが分かります。
if (data.at(k) == data.at(k+1)) { ans = true; }
if (data.at(k) == data.at(k+1)) { ans = true; }
ヒント3 (ループで書き直す)
クリックでヒントプログラムを見る
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- vector<int> data(5);
- for (int i = 0; i < 5; i++) {
- cin >> data.at(i);
- }
- // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する
- bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする
- for (int i = 0; i < /* ここを変える */; i++) {
- if (data.at(i) == data.at(i + 1)) {
- /* ここを変える */
- }
- }
- if (ans) {
- cout << "YES" << endl;
- }
- else {
- cout << "NO" << endl;
- }
- }
#include <bits/stdc++.h> using namespace std; int main() { vector<int> data(5); for (int i = 0; i < 5; i++) { cin >> data.at(i); } // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする for (int i = 0; i < /* ここを変える */; i++) { if (data.at(i) == data.at(i + 1)) { /* ここを変える */ } } if (ans) { cout << "YES" << endl; } else { cout << "NO" << endl; } }
テスト入出力
書いたプログラムがACにならず、原因がどうしてもわからないときだけ見てください。
クリックでテスト入出力を見る
テスト入力1
0 1 2 3 3
テスト出力1
YES
テスト入力2
0 1 100 100 4
テスト出力2
YES
テスト入力3
40 30 66 44 65
テスト出力3
NO
解答例
必ず自分で問題に挑戦してみてから見てください。
クリックで解答例を見る
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- vector<int> data(5);
- for (int i = 0; i < 5; i++) {
- cin >> data.at(i);
- }
- // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する
- bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする
- for (int i = 0; i < 4; i++) {
- if (data.at(i) == data.at(i + 1)) {
- ans = true;
- }
- }
- if (ans) {
- cout << "YES" << endl;
- }
- else {
- cout << "NO" << endl;
- }
- }
#include <bits/stdc++.h> using namespace std; int main() { vector<int> data(5); for (int i = 0; i < 5; i++) { cin >> data.at(i); } // dataの中で隣り合う等しい要素が存在するなら"YES"を出力し、そうでなければ"NO"を出力する bool ans = false; // 始めはfalseにしておき、条件を満たすときにtrueになるようにする for (int i = 0; i < 4; i++) { if (data.at(i) == data.at(i + 1)) { ans = true; } } if (ans) { cout << "YES" << endl; } else { cout << "NO" << endl; } }