けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 260 A - A Unique Letter (7Q, 灰色, 100 点)

条件が複雑なので、綺麗に整理しよう!

問題概要

3 文字の文字列  S が与えられる。

 S の中に「一度だけ登場する文字」が存在するならば、そのうちのどれか 1 つを出力せよ。

一度だけ登場する文字が存在しない場合は -1 と出力せよ。

考えたこと

いろんな解法が考えられる。まず、3 個の文字の被り方のパターンは次のいずれかになる。


  1. 3 個すべて同じ文字である
  2. 2 個が同じ文字で、残りの 1 個は異なる文字である
  3. すべて互いに相異なる文字である

これらを順に見ていこう。

パターン 1:3 個すべて同じ文字

この場合は「一度だけ登場する文字」は存在しないので、-1 を出力しよう。

パターン 2:2 個が同じ文字で、残りの 1 個は異なる文字

この場合は、さらに次の 3 パターンに分かれる。

  • S[0] == S[1] のとき:残りの S[2] は一度だけ登場する文字である
  • S[1] == S[2] のとき:残りの S[0] は一度だけ登場する文字である
  • S[2] == S[0] のとき:残りの S[1] は一度だけ登場する文字である

パターン 3:すべて互いに相異なる文字

この場合は、S[0], S[1], S[2] のうちのどれを出力してもよい。

コード

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

int main() {
    string S;
    cin >> S;

    if (S[0] == S[1] && S[1] == S[2])
        cout << -1 << endl;
    else if (S[0] == S[1])
        cout << S[2] << endl;
    else if (S[1] == S[2])
        cout << S[0] << endl;
    else if (S[2] == S[0])
        cout << S[1] << endl;
    else
        cout << S[0] << endl;
}