見出し画像

ABC204 A 解答

A - Rock-paper-scissors(7)

問題

問題文

サーバル、フェネック、アライグマの 3 人がじゃんけんをして、あいこになりました。
フェネックが出した手を表す文字 x とアライグマが出した手を表す文字
y が与えられます。それぞれ、0 はグー、1 はチョキを、2 はパーを表します。
サーバルが出した手を表す文字を出力してください。なお、答えは一意に定まります。

制約

x, y は 0, 1, 2 のいずれか

考察

3人でじゃんけんをします。そしたらどうやらあいこだったみたいです。

2人の出した手はわかってますので、そこからもう1人の手を求めましょう。

手の状況は次の2つに分かれます。

1)2人が同じ手だった場合

このときは、3人目も同じ手になりますね。ですので、1人目でも2人目でもどちらでもいいので、その手を出力しましょう。

2)異なる手だった場合

このときは1人目とも2人目とも異なる手を出せば正解です。色々とやり方はありますが、if文で書いてしまうのが一番単純ですかね。

上記の2通りを書いてあげればACです。実装しましょう。

実装

#include<bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define reps(i,s,n) for(int i=s;i<n;++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;

int main()
{
   int x, y;
   cin >> x >> y;
   if (x == y) cout << x << endl;
   else
   {
       if (x == 0 && y == 1) cout << 2 << endl;
       else if (x == 0 && y == 2) cout << 1 << endl;
       else if (x == 1 && y == 0) cout << 2 << endl;
       else if (x == 1 && y == 2) cout << 0 << endl;
       else if (x == 2 && y == 0) cout << 1 << endl;
       else if (x == 2 && y == 1) cout << 0 << endl;
   }
   return 0;
}

あとがき

今回はif文で書きましたが、もうちょっと効率を求めましょう。どうやら「ぐーちょきぱー」はそれぞれ1、2、3と割り振られているようですので、それを利用します。

2人の手が異なるときは3人目も異なる手を出す必要があります。ということはみんな違う手を出しています。それがあいこのルールです。ですので、みんなの手の合計は3になります。ということで、3から1人目と2人目の手を引いてあげれば、if文を少なくできます。私はコンテスト中はこの方法で解きました。

さらに効率の良い方法としましては

(6-x-y)%3

というものがあるみたいです。これなら同じかどうかの判定も必要ありません。どう考えたらこの式が出てくるんですかね。とっても不思議です。

シンプルですが色々な考え方のできる良い問題でした。

この記事が気に入ったらサポートをしてみませんか?