EX16 - 2.01 Editorial /

Time Limit: 2 sec / Memory Limit: 256 MB

説明ページに戻る

問題文

5つの要素からなる配列が与えられます。 同じ値の要素が隣り合っているような箇所が存在するかどうかを判定してください。
存在するなら"YES"を、存在しなければ"NO"を出力してください。

この問題も以下の手順で解いてみましょう。

  1. ループを使わないで書く
  2. パターンを見つける
  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"を出力する
  // ここにプログラムを追記
}

制約

  • 0≦A_i≦100 (1 ≦ i ≦ 5)
  • A_i (1 ≦ i ≦ 5)は整数

入力

入力は次の形式で標準入力から与えられます。

A_1 A_2 A_3 A_4 A_5

出力

配列の隣り合う要素のうち、値が等しいものが存在するなら"YES"を、存在しなければ"NO"を出力してください。

出力の最後には改行が必要です。


ジャッジでは以下の入力例以外のケースに関してもテストされることに注意。

入力例1

5 3 3 1 4

出力例1

YES

入力例2

1 1 2 3 4

出力例2

YES

入力例3

1 2 1 2 1

出力例3

NO

入力例4

100 100 100 100 100

出力例4

YES

ヒント

  1. ループを使わないで書く
  2. パターンを見つける
  3. ループで書き直す

に沿って書く場合の流れをヒントで説明します。

まずは自分で考えてみて、詰まったら見てみましょう。

ヒント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;
  }
}

ヒント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;
}

このままだと直接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;
  }

次のパターンが繰り返し存在していることが分かります。

  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;
  }
}


テスト入出力

書いたプログラムが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;
  }
}