[백준] 신기한 소수 c++
2024. 10. 19. 14:35ㆍ코딩테스트
신기한 소수
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 | 4 MB | 26922 | 13115 | 9216 | 46.073% |
문제
수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다.
7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수이고, 7도 소수이다. 즉, 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이다! 수빈이는 이런 숫자를 신기한 소수라고 이름 붙였다.
수빈이는 N자리의 숫자 중에서 어떤 수들이 신기한 소수인지 궁금해졌다. N이 주어졌을 때, 수빈이를 위해 N자리 신기한 소수를 모두 찾아보자.
입력
첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.
출력
N자리 수 중에서 신기한 소수를 오름차순으로 정렬해서 한 줄에 하나씩 출력한다.
DFS 알고리즘을 활용하고, 탐색횟수를 줄이기 위해서는 탐색 시작 수와 두번째 자리부터는 홀수만을 이용해 소수를 구한다.
#include <iostream>
using namespace std;
void DFS(int number, int size);
bool IsPrime(int number);
static int N;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
int first[4] = { 2,3,5,7 };
//첫번째 자리수는 2,3,5,7만 확인하면 된다.
for (int i = 0; i < 4; i++)
{
DFS(first[i], 1);
}
}
void DFS(int number, int size)
{
if (size == N)
{
if (IsPrime(number))
{
cout << number << "\n";
}
return;
}
//홀수만 확인하면된다.
for (int i = 1; i < 10; i++)
{
if (i % 2 == 0)
{
continue;
}
//자리수를 게속 곱해주면서 자리수를 늘려간다.
if (IsPrime(number * 10 + i))
{
DFS(number * 10 + i, size + 1);
}
}
}
//소수인지 확인하는 함수, number를 i로 나누었을때 값이 0이면 소수가 아니다, i의 최대값은 number값의 절반
bool IsPrime(int number)
{
for (int i = 2; i <= number / 2; i++)
{
if (number % i == 0)
{
return false;
}
}
return true;
}
'코딩테스트' 카테고리의 다른 글
[프로그래머스] N개의 최소공배수 (0) | 2024.10.21 |
---|---|
[프로그래머스] 점프와 순간이동 (0) | 2024.10.21 |
[백준] 연결 요소의 개수 c++ (1) | 2024.10.19 |
[백준] 수 정렬하기2 c++ (0) | 2024.10.10 |
[백준] ATM c++ (1) | 2024.10.01 |