알고리즘 공부(C++)

[C++]프로그래머스 소수 찾기 (next_permutation)

혀니리리 2023. 6. 6. 17:29
728x90

코딩테스트 연습 - 소수 찾기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

bool isPrime(int n){ //외워두는 게 좋을 것
    if(n < 2) return false;
    for(int i = 2; i * i <= n; i++)
        if (n % i == 0) return false;
    return true;
}

int solution(string numbers) {
    int answer = 0;
    vector<char> v;
    vector<int> nums;
    for(int i = 0; i < numbers.size(); i++)
        v.push_back(numbers[i]);//한글자씩 vector에 저장
    sort(v.begin(), v.end());//오름차순 정렬
    do{
        string temp= "";
        for(int i = 0; i <v.size(); i++)//모든 순열마다 문자열 길이 하나씩 게 해서 배열에 집어넣음
        {
            temp.push_back(v[i]); //if 123이면 temp= 1 12 123
            nums.push_back(stoi(temp));//if 123이면 nums 1 12 123
        }
    }while(next_permutation(v.begin(), v.end()));//모든순열(next_permutation이용해 do,while사용)
    sort(nums.begin(), nums.end());//완성된 nums를 오름차순 정렬(크기다른 모든 순열이 들어있음)
    nums.erase(unique(nums.begin(), nums.end()), nums.end()); (nums.erase(unique(), nums.end())를 사용해 중복 제거)
    for(int i=0; i< nums.size(); i++)
        if(isPrime(nums[i]))//중복이 제거된 모든 순열 nums에서 isPrime함수를 이용해 answer를 구한다.
            answer++;
    return answer;
}

 

nums.erase(unique(nums.begin(), nums.end()), nums.end()); //외워두기

do{

 

}while(next_permutation(v.begin(), v.end())); //외워두기2

 

bool isPrime(int n)

{

   if(n < 2)

       return false;

   for(int i = 2; i*i <= n; i++)

   {

      if(n % 2 == 0)

         return false;

   }

   return true;

} //외워두기 3

728x90