[プログラマー]Summer/Winter Coding(~218)>小数点の作成



最近解決された問題の中には少数に関連する問題がたくさんある.
もう一度これを作ろうかと思ったら小数のコードを作るのを忘れないでください
しかし一般的に小数を作るときに終わるのではなく、この問題のように小数を利用します.
この問題では,小数アルゴリズムよりも,数値配列の3つの組合せをどのように作成するかが重要である…!
補助配列順による組み合わせを利用しました
5つの数字の配列の中から3つの数字の組み合わせを選択すると、以下の手順に従います.
  • の組み合わせに補助配列を作成します.
    -0と1で構成する必要があります.0は前でなければなりません.
    - int subPermutation = [ 0, 0, 1, 1, 1 ];
  • および補助配列に対してnext permutationを連続的に呼び出し、可能なすべての状況の数を得る.
  • では、1の位置係数を元のアレイから引き抜くと、
  • に結合します.
    本来next permutationと書くにはsortが必要ですが、ここでは、最初の配列の作成から0を入れて1を埋め、単独でsortを行わないでください.
    学識
  • によるアシストアレイのシーケンス作成の組合せ方法
  • ベクトルと配列の違い
  • 普通のベクトルをよく使うのはここで初めて?
    arrayとvectorを混合して使用します.最初の解関数の因子はベクトルです
    この時間はあまり悩んでいないようなので、違いを見てみました.
    作成
  • Vector:エレメントを順番に格納可能なコンテナ
  • アレイ:インデックスベースの基本データ構造
  • メモリ
  • Vector:アレイよりも多くのメモリ容量を消費する
  • アレイ:高メモリ効率
  • 長さ(length)
  • Vector:動的に変更可能
  • アレイ:固定
  • 使用
  • Vector:エレメントを頻繁に挿入および削除します.しかし、途中で挿入または削除が多すぎると、効率が低下する
  • .
  • Array:多数の要素を表示する必要がある場合.クエリ時間はO(1)
  • 理解すると、この問題では、挿入と削除は動的ではないのでarrayを使用することができます.
    // 소수 만들기 https://programmers.co.kr/learn/courses/30/lessons/12977
    #include <vector>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    bool IsPrimeNumber(int num) {
        for(int i = 2; i <= num/2; i++) {
            if(num % i == 0) {  
                return false;
            }   
        }
        return true;
    }
    
    int solution(vector<int> nums) {
        // 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수
        int answer = 0;
        int numsSize = nums.size();
    
        // 1. 조합을 위한 보조 순열 만들기  
        int subPermutation[numsSize];
        for(int i=0; i<numsSize-3; i++) {
            subPermutation[i] = 0;
        }
        for(int i=numsSize-3; i<numsSize; i++) {
            subPermutation[i] = 1;
        }
        
        // 2. 소수의 개수 판단
        do {
            int sum = 0;
            for(int i=0; i<numsSize; i++) {
                // elem이 1이면 sum에 더해보고 소수이면 answer++
                if(subPermutation[i] == 1) {
                    sum += nums[i];
                }
            }
            if(IsPrimeNumber(sum)) {
                answer++;
            }
        } while(next_permutation(subPermutation, subPermutation + nums.size()));
    
        return answer;
    }