Problem Solving

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

wisdom11 2021. 8. 2. 23:58

문제 링크:

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

 

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

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

programmers.co.kr

 

 

문제 설명

 

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

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

 

 


문제 해결

 

이 문제는 간단하게 완전탐색으로 푸는 문제였다.

 

입력으로 받은 문자열로부터 0~9까지의 숫자가 몇 개씩 있는지 배열에 저장한 후, 배열의 값이 0보다 큰 경우 재귀 함수를 통해 탐색하는 방식으로 해결하였다. 이러한 로직을 다음의 두 가지 함수로 구현하였다.

  • 소수 판별 함수 (isPrime)
  • 탐색하면서 가능한 숫자를 만들어주는 함수 (make)

해결 방법이 어렵지 않고 level2인 만큼 무난한 난이도라 큰 어려움은 없었지만, 구현 시 신경써야 할 부분이 있다면 입력 문자열로부터 새로운 숫자 문자열을 만드는 부분과 문자열을 숫자로 변환해주어야 하는 부분이었던 것 같다.

 

 


소스코드

 

#include <string>
#include <vector>
using namespace std;
int num[10] = {0, };
int ans = 0;

bool isPrime(int num) {
    for(int i=2; i*i <= num; i++)
        if(num % i == 0) return false;
    return true;
}

void make(string now, int arr[10]) {
    int copy[10];
    int last = now.back()-'0';
    for(int i=0; i<10; i++)
        copy[i] = arr[i];
    copy[last]--;

    int nowNum = 0;
    for(int i=0; i<now.length(); i++)
        nowNum = nowNum * 10 + (now.at(i)-'0');

    if(nowNum >= 2 && isPrime(nowNum))
        ans++;

    for(int i=0; i<10; i++){
        if(copy[i] > 0)
            make(now + char(i+'0'), copy);
    }
}

int solution(string numbers) {
    int len = numbers.length();
    for(int i=0; i<len; i++) {
        int n = numbers.at(i)-'0';
        num[n]++;
    }

    for(int i=1; i<10; i++){
        if(num[i] < 1) continue;
        string tmp;
        make(tmp+char(i+'0'), num);
    }
    return ans;
}

 

깃허브:

https://github.com/jihyehann/PS/blob/main/programmers/42839/42839.cpp

 

 

728x90