
function sol0(nums) {
let answer = 0;
let sum = 0;
const length = nums.length;
nums.sort((a, b) => b - a);
let i = 0;
while (i < 3) {
sum += nums[i];
i++;
}
i = 2;
let primNumber = [];
while (i <= sum) {
if (isPrime(i)) {
primNumber.push(i);
}
i++;
}
let p = 0;
while (p < length - 2) {
let q = p + 1;
while (q < length - 1) {
let r = q + 1;
while (r < length) {
let threeNums = nums[p] + nums[q] + nums[r];
if (primNumber.includes(threeNums)) {
answer++;
}
r++;
}
q++;
}
p++;
}
return answer;
}
function isPrime(num) {
let i = 2;
let numSqrt = parseInt(Math.sqrt(num))
while (i <= numSqrt) {
if (num % i === 0) {
return false;
}
i++;
}
return true;
}
어제 만든 소수를 구하는 함수를 이용했다.
function primecheck(n){
for(var i=2;i<=Math.sqrt(n);i++){
if(n%i == 0){
return false;
}
}
return true;
}
function sol1(nums){
var cnt = 0;
for(var i=0;i<nums.length-2;i++){
for(var j=i+1;j<nums.length-1;j++){
for(var w=j+1;w<nums.length;w++){
if(primecheck(nums[i]+nums[j]+nums[w])){
cnt++;
}
}
}
}
return cnt;
}
소수의 목록을 만드는게 불필요한 행동이었다.
반복문 3중첩이므로
그리고 소수 여부를 판단하는 함수의 복잡도가
즉 라는 복잡한 방법이 나왔다. 는 최소 1.7이 넘으므로 시간복잡도가 매우 큰 값이 나온 것 같다.

시간복잡도는 같지만 구체적인 구현을 더 간단하게 한 쪽이 훨씬 빠르다.

최악의 경우의 수인 10배 증가시켰는데 1000배 증가한 모습이다.
알고리즘을 짠 수학적 근거만큼이나 구체적인 구현도 중요함을 알 수 있다.

sol1이 오히려 속도가 더 빨라지는데 이유를 모르겠다.
Math.sqrt(n) 의 크기가 일정 수준으로 유지되어서 오히려 빨라진다는데 이건 그냥 ai의 개소리같다. (애초에 틀려먹은 전제지만)이 말대로라면 실행 시간이 특정 값에 수렴해야지 더 줄어들수는 없다.이유를 알 수 없다.

피보나치 수열을 쓰면 될것같다.
function sol0(n) {
var answer = 0;
let i = 3
let F = [0,1, 2]
while (i <= n) {
F[i] = (F[i - 2] + F[i - 1]) % 1234567;
i++;
}
answer = F[n];
return answer;
}
그렇다 수학은 신인것이다!
function sol1(n) {
var answer = 0;
var dp=[];
dp[1]=1;
dp[2]=2;
for(var i=3;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2] %1234567;
}
answer=dp[n];
return answer%1234567;
}
[0]번 인덱스를 구현할 필요가 없었다. 큰 의미는 없겠지만...
너무 길어서 따로 뺌
이것이 하드 코딩이 멸망편...
범위가 정해진 경우에 한해서는 좋을지도?
sol0,sol1 :
sol2 : 일줄 알았는데 GPT에게 물어보니 배열의 정렬에도 시간이 들기 때문에 이라고 한다...

GPT가 준 답으로는 sol2가 젤 증가율이 커야하는데 그렇지 않다.

아무래도 GPT가 잘못 알려준것같다 이 아닌이상 이런 결과 값이 나올리가 없다.

위와 같이 안나누면 00
안에서 나누면 10 밖에서 나누면 01
양쪽다에서 나누면 11 로 네이밍했다.

당연히 값을 미리미리 작게 만드는 10이 빠르다.
의외인 점은 00보다 01이 느리다는 것이다.
큰값을 쌓은다음에 마지막에 처리를 하기 때문에 느린걸까?