[프로그래머스/C++] 소수 찾기

연성·2021년 9월 3일
0

코딩테스트

목록 보기
230/261
post-thumbnail
post-custom-banner

[프로그래머스/C++] 소수 찾기

1. 문제

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

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

2. 제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • "013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

3. 풀이

  • 가능한 모든 경우의 수를 조사하면 된다.
  • dfs를 이용해서 모든 경우를 찾아주었다.
    • 1자리 숫자부터 numbers의 자리수와 같은 숫자까지 모든 경우를 조사한다.
  • 만든 숫자가 소수이면 set에 삽입한다.
    • 만든 숫자가 중복일 수 있기 때문에 set을 이용하였다.
  • set의 크기를 return한다.

4. 처음 코드와 달라진 점

  • dfs 결과 처리가 잘 안되서 set을 전역변수로 처리했다.
  • 소수 찾기에서 0과 1을 처리해주지 않아서 추가했다.

5. 코드

#include <iostream>
#include <string>
#include <vector>
#include <set>

using namespace std;

bool visited[7] = {0, };
set<int> s;

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

void dfs(int targetLength, string numbers, string number ="") {
    if (number.size() == targetLength) {
        int n = stoi(number);
        if (isPrimeNumber(n)) {
            s.insert(n);
        }
    }
    else {
        for (int i = 0; i < numbers.size(); ++i) {
            if (visited[i]) continue;
            number += numbers[i];
            visited[i] = true;
            
            dfs(targetLength, numbers, number);
            number.pop_back();
            visited[i] = false;
        }
    }
}

int solution(string numbers) {
    for (int i = 1; i <= numbers.size(); ++i) {
        dfs(i, numbers);
    }

    return s.size();
}
post-custom-banner

0개의 댓글