-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
08.15: prime number, backtracking(신기한 소수)
- Loading branch information
1 parent
a2904e5
commit a9905d2
Showing
2 changed files
with
125 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
// 신기한 소수: 소수, 백트래킹 | ||
#include <iostream> | ||
#include <vector> | ||
#include <sstream> | ||
#include <cmath> | ||
|
||
using namespace std; | ||
|
||
string makeString(vector<int> &visited) { | ||
stringstream ss; | ||
string ans; | ||
|
||
for (int i = 0; i < visited.size(); i++) { | ||
ss << visited[i]; | ||
} | ||
|
||
ss >> ans; | ||
|
||
return ans; | ||
} | ||
|
||
bool checkPrime(vector<int> &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<int> &visited, vector<bool> &prime, vector<string> &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<string> answer(0); | ||
vector<int> visited(0); | ||
vector<bool> 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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 : 백트래킹 | ||
// - 첫 번째 자리부터 유망하지 않은 케이스는 제외 | ||
|
||
// 백트래킹의 시간 복잡도는 어떻게 계산하는가? |