백준 9020번 골드바흐의 추측-JS

yugyeongKim·2021년 10월 22일
0

백준

목록 보기
22/52
post-custom-banner

- 제출한 코드

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\n');
let answer = '';
let T = Number(input.shift());

for(let i=0; i < T; i++) {
    let N = Number(input[i]);
    let primeArr = new Array(N+1);
    primeArr.fill(true);
    primeArr[0] = primeArr[1] = false;
    for(let n = 2; n <= Math.sqrt(N); n++) {
        if(primeArr) {
            let m = 2;
            while (n * m <= N) {
                primeArr[n * m] = false;
                m++;
            }
        }
    }
    let result = []; //N의 소수 배열
    primeArr.forEach((element,index) => {
        if(element) {
            result.push(index);
        }
    });
    let resultLen = result.length;
    let semiArr = [];
    for(let x=resultLen; x > 0; x--) {
        let resultGap = N - result[x];
        if(result.includes(resultGap)) {
            semiArr.push(resultGap);
        }
    }

    let semiLen = semiArr.length;
    if(semiLen === 2) {
        answer += semiArr[0] + ' ' + semiArr[1] + '\n';
    } else if((semiLen%2) === 0) {
        answer += semiArr[(semiLen/2)-1] + ' ' + semiArr[semiLen/2] + '\n';
    } else {
        answer += semiArr[Math.floor(semiLen/2)] + ' ' + semiArr[Math.floor(semiLen/2)] + '\n';
    }
}
console.log(answer);

장황하고 시간오래걸리고 메모리도 많이 든다. 다른사람들 거 많이 보자
일단 과정들을 설명하면
1. 테스트 케이스를 반복하는 for문을 작성
2. 숫자N(input배열의 숫자)의 소수를 구해 result변수에 넣는다.(앞 게시물 참고)
3. 소수 중 N-result[i] 값이 result변수들 중 하나의 값과 같다면, semiArr에 넣는다.(작은수부터 넣기 위해 배열의 길이부터0까지 1씩 빼주는 for문 작성)
4. semiArr배열 길이가 2이면 그 두개를 출력, 길이가 2가 아닌 짝수이면 가운데 두 값을 출력, 그것도 아니면(길이가 홀수) 가운데 값을 두번 출력

post-custom-banner

0개의 댓글