박기완 코딩교육/코딩테스트 대비

프로그래머스 소수 찾기 문제

hackee 2020. 10. 21. 23:59

안녕하세요! 오늘은  프로그래머스 소수찾기 문제를  풀었습니다.

programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 �

programmers.co.kr

 

이 문제는 모든 경우의수를 따지기만해도 충분히 풀 수 있습니다.

 

numbers 길이가 최대 7이고, numbers는 숫자 0~9로 이루어져있기에

최대 가능한 숫자가 9,999,999 입니다.  

에라토스테네스의 체를 이용해  소수를 파악하고,

numbers 길이가 최대 7이므로  나올 수 있는 모든 숫자 경우의 수가 7! 입니다.

 

이런 상황이기에   완전탐색으로해도  시간내 풀이가 가능한것이죠.

 

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


 //값 0인애들이 소수 (2이상일떄) 
int isPrime[10000000]={};
int canCnt = 0;
int visited[8]={};

//모든 경우의수 따지기
void findCase(int step, int num, string numbers){
	if(step == numbers.size()){
		if(isPrime[num] == 0) {
			canCnt++;
			isPrime[num] = 2;
		}
		return ;
	}
	
	for(int i=0;i<numbers.size();i++){
		if(visited[i] == 0){
			visited[i] = 1;
            //해당 숫자를 포함하거나
			findCase(step+1, num*10 + (numbers.at(i)-'0'), numbers);
            //숫자 건너띄거나
            findCase(step+1, num, numbers);
			visited[i] = 0;
		}
	}
}

int solution(string numbers) {
    int answer = 0;
    isPrime[1]=2;
    
    //소수 여부 담기  (값이 0인애가 소수)
    for(int i=2; i*i<=9999999;i++){
    	if(isPrime[i] == 2) continue;
    	
    	if(isPrime[i] == 0){
    		for(int j=2;j*i<=9999999;j++){
    			isPrime[i*j] = 2;
    		}
    	}
    }
    

//백트랙하면서 가능한 모든숫자 표시
	for(int i=0;i<numbers.size();i++){
		visited[i]=1;
        if(numbers.at(i) != '0')
            findCase(1, numbers.at(i)-'0', numbers);
		visited[i]=0;
	}
	
	 
	answer=  canCnt;
    
    
    
    return answer;
}

 

 

<박기완의 c언어 코딩교육 시리즈 >

 

게임개발을 희망하는 초등학생, 중학생, 고등학생들을 위한 c언어 책

이 글을 보고있다는건 게임개발에 관심있다는 거겠죠? 그렇다면 정말 잘보셨습니다. 읽기 쉽고,  단기간 내에 자기꺼화 할 수 있게 최대한 핵심만 담았습니다. 게임을 어떻게 만드는지 궁금해

blog.codingteacher.kr

 

초등, 중등, 고등  1:1 원격 c언어 교육문의

010 - 4537 - 7998

 

현재 대치동 학원에서 코딩강사로 활동중에 있습니다

영재고, 과학고 내신 /

초등, 중등, 고등 입문반, 초급, 중급, 정올반 /

앱, 게임 제작반  문의주세요!