プログラマー:宝くじの最高と最低ランキング



1.近接


2つの配列の値が等しいかどうかを決定するために、2つの配列は昇順に配列されます.
  • は単純な0ではなく、6桁の桁数で値が同じかどうかをチェックできます.
    =>より大きくするためには、重複文の実行を最大限に減らすためには、宝くじ番号が当選番号より小さい位置にあると、その数字がないので、重複文から逃れる.
  • マッチング番号の個数(正しい)と0の個数(ゼロ数)を取得した後、その値を等数に変換する.
    =>6個のマッチングが1番、5個のマッチングが2番、...1つの一致は6位で、等数+一致個数=7です.
    (ここでは、0マッチングを無視しても6位だったので、間違った答えが出てしまいました…)
  • したがって、最大等位数は7から最大等位数を減算することに等しく、この値は1以上であるべきである.
    (同時に、6以下でなければなりません.)
  • などの出力プロセスを簡単に実現するために,式を用いたが,かえって複雑に見える.
  • 2.私の回答

    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    vector<int> solution(vector<int> lottos, vector<int> win_nums) {
        vector<int> answer;
        sort(lottos.begin(),lottos.end());
        sort(win_nums.begin(),win_nums.end());
        
        int correct=0;
        int zerocount=0;
        for(int i=0,j=0;i<6;i++){
            if(lottos[i]==0)    {
                zerocount++;
                continue;
            }
            for(;j<6;j++){
                if(lottos[i]==win_nums[j]) correct++;
                else if(lottos[i]<win_nums[j]) break;
            }
            /* 단순한 반복문
            for(int j=0;j<6;j++){
                if(lottos[i]==win_nums[j])  correct++;
            }
            */
        }
    
        answer.push_back(min(max(7-(correct+zerocount),1),6));
        answer.push_back(min(7-(correct),6));
        return answer;
    }