はまやんはまやんはまやん

hamayanhamayan's blog

Lucky Purchase [HackerRank Week of Code 35 A]

https://www.hackerrank.com/contests/w35/challenges/lucky-purchase

N個の名前と値段が付いた商品がある。
この中で以下の条件を満たす商品名を答えよ。

  • 値段を文字列として見た時に、4と7の個数が同じ
  • 値段を文字列として見た時に、4と7だけで構成されている
  • 上の条件を満たす中で、値段を数値として見た時に最小の商品名を答える
  • もし、条件を満たす商品が1つも無ければ"-1"出力

解法

条件を満たすようにチェックして、満たすなら最小かどうか判定して更新していくだけ。
文字列として見るが、実際にto_stringとして文字列にしても良いし、10で割りながらカウントしていってもいい。

#define INF INT_MAX/2
int N;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N;

    string ans = "-1";
    int mi = INF;

    rep(i, 0, N) {
        string S; int x; cin >> S >> x;
        
        int ok = 1;
        int c4 = 0, c7 = 0;
        int y = x;
        while (0 < y) {
            int z = (y % 10); y /= 10;

            if (z == 4) c4++;
            else if (z == 7) c7++;
            else ok = 0;
        }

        if (ok and c4 == c7) if (x < mi) {
            ans = S;
            mi = x;
        }
    }

    cout << ans << endl;
}