Official

A - Full House Editorial by nok0


プログラミングの学習を始めたばかりで何から手をつけるべきかわからない方は、まずは「practice contest」(https://atcoder.jp/contests/practice/) の問題A「Welcome to AtCoder」をお試しください。言語ごとに解答例が掲載されています。
また、プログラミングコンテストの問題に慣れていない方は、「AtCoder Beginners Selection」(https://atcoder.jp/contests/abs) の問題をいくつか試すことをおすすめします。
「競プロ典型 90 問」(https://atcoder.jp/contests/typical90) では、プログラミングコンテストで扱われる典型的な 90 問の問題に挑戦可能です。
「C++入門 AtCoder Programming Guide for beginners (APG4b)」(https://atcoder.jp/contests/APG4b) は、競技プログラマー向けのC++入門用コンテンツです。


この問題は、ABC260-A をより難しくしたバージョンとなっています。まだ ABC260-A を解いてない方は、はじめにそちらを解かれることを推奨します。

ABC260-A と同様に各数字の出現回数を調べ、\(3\) 回出現しているものと \(2\) 回出現しているものが存在すれば答えは Yes です。

ここでは折角なので別の解法を紹介しましょう。

入力を長さ \(5\) の列として見て、昇順にソートします。(この列を \(A\) とします。)

このとき、\(3\) 回出現しているものと \(2\) 回出現しているものの大小関係で場合分けを行うと、フルハウスであることと以下のどちらか一方が成立することが同値です。

  • \(A[0]=A[2]\) かつ \(A[3]=A[4]\)

  • \(A[0]=A[1]\) かつ \(A[2]=A[4]\)


(補足)

この同値変形について、以下加筆します。

\(3\) 回出現している値 < \(2\) 回出現している値のとき、

\(A[0]=A[1]=A[2] < A[3]=A[4]\) です。数列 \(A\) が昇順であることから、 \(A[0]=A[1]=A[2]\) であることと、\(A[0]=A[2]\) であることが同値です。さらに、入力の \(5\) つの数全てが同じことはないので、\(A[0]=A[2]\) かつ \(A[3]=A[4]\) のとき \(A[2]<A[3]\) は自動的に従います。

よって \(A[0]=A[2]\) かつ \(A[3]=A[4]\) が導かれます。

\(3\) 回出現している値 > \(2\) 回出現している値のときも同様です。


これを配列、ソート、条件分岐を用いて実装すればよいです。実装が分からない方は実装例を参考にしてください。

実装例(c++)

#include<bits/stdc++.h>
using namespace std;

int main(){
    vector<int> a(5);
    for(int i = 0; i < 5; i++) cin >> a[i];
    sort(a.begin(), a.end());
    if((a[0] == a[2] and a[3] == a[4]) or (a[0] == a[1] and a[2] == a[4])) cout << "Yes" << endl;
    else cout << "No" << endl;
}

実装例(python)

a = list(map(int, input().split()))
a.sort()
if (a[0] == a[2] and a[3] == a[4]) or (a[0] == a[1] and a[2] == a[4]):
    print("Yes")
else:
    print("No")

posted:
last update: