diff --git a/baekjoon/2023.cpp b/baekjoon/2023.cpp new file mode 100644 index 0000000..67d5063 --- /dev/null +++ b/baekjoon/2023.cpp @@ -0,0 +1,76 @@ +// 신기한 소수: 소수, 백트래킹 +#include +#include +#include +#include + +using namespace std; + +string makeString(vector &visited) { + stringstream ss; + string ans; + + for (int i = 0; i < visited.size(); i++) { + ss << visited[i]; + } + + ss >> ans; + + return ans; +} + +bool checkPrime(vector &visited) { + string ans = makeString(visited); + int target = atoi(ans.c_str()); + int root = sqrt(target); + bool flag = false; + for (int i = 2; i <= root; i++) { + if (!(target % i)) { + flag = true; + break; + } + } + + return flag ? false : true; + +} + +void recur(int n, vector &visited, vector &prime, vector &answer) { + if (!checkPrime(visited)) { + return; + } + if (visited.size() && !prime[visited[0]]) { + return; + } + if (visited.size() == n) { + string ans = makeString(visited); + + answer.push_back(ans); + return; + } + for (int i = 0; i <= 9; i++) { + visited.push_back(i); + recur(n, visited, prime, answer); + visited.pop_back(); + } +} + +int main(void) { + int n; + vector answer(0); + vector visited(0); + vector prime(10, false); + + prime[2] = true; + prime[3] = true; + prime[5] = true; + prime[7] = true; + cin >> n; + recur(n, visited, prime, answer); + + for (int i = 0; i < answer.size(); i++) { + cout << answer[i] << endl; + } + + return 0; +} \ No newline at end of file diff --git a/baekjoon/2023.js b/baekjoon/2023.js new file mode 100644 index 0000000..8fdf605 --- /dev/null +++ b/baekjoon/2023.js @@ -0,0 +1,49 @@ +// 신기한 소수: 소수, 백트래킹 +const n = Number(require("fs").readFileSync(0, "utf-8").toString().trim()); +const primes = { 2: true, 3: true, 5: true, 7: true }; +const answer = []; + +function checkPrime(visited) { + const target = Number(visited.join("")); + const root = Math.sqrt(target); + let flag = false; + for (let i = 2; i <= root; i++) { + if (!(target % i)) { + flag = true; + break; + } + } + + return flag ? false : true; +} + +(function recur(visited = []) { + if (!checkPrime(visited)) { + return; + } + + if (visited.length && !primes[visited.at(0)]) { + return; + } + + if (visited.length === n) { + answer.push(visited.join("")); + return; + } + + for (let i = 0; i <= 9; i++) { + visited.push(i); + recur(visited); + visited.pop(); + } +})(); + +console.log(answer.join("\n")); + +// Try 1 : 모든 소수를 구하고 백트래킹을 통해 소수인지를 확인 +// - 7자리 이상의 모든 소수를 구하는 과정에서 시간 초과 + +// Try 2 : 백트래킹 +// - 첫 번째 자리부터 유망하지 않은 케이스는 제외 + +// 백트래킹의 시간 복잡도는 어떻게 계산하는가?