문제

풀이

#include <bits/stdc++.h>

using namespace std;

int n;

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

	return true;
}

void solve(int num, int digit)
{
	if (digit == n)
	{
		if (isPrime(num))
		{
			cout << num << "\n";
		}

		return;
	}

	for (int i = 1; i < 10; i++)
	{
		if (i % 2 == 0)
		{
			continue;
		}

		if (isPrime(num * 10 + i))
		{
			solve(num * 10 + i, digit + 1);
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> n;
	solve(2, 1);
	solve(3, 1);
	solve(5, 1);
	solve(7, 1);

	return 0;
}

백트래킹으로 하나하나 시도하면 된다. 일단 한 자릿수 소수는 2, 3, 5, 7이므로 이 숫자로 탐색을 시작한다. 그 뒤에 붙는 수들은 일의 자리가 되므로 홀수로만 붙여나가면 된다(2를 제외한 모든 소수는 홀수이므로).

배운 점과 후기

소수의 정의에 따라 후보군을 좁혀나간다는 점에서 백트래킹의 개념을 리마인드하기 좋은 문제인 것 같다.

댓글남기기