백준 17103 골드바흐의 파티션

김현민·2023년 12월 14일
0

Algorithm

목록 보기
126/126
  let arr = Array(max + 1)
    .fill(true)
    .fill(false, 0, 2);

  for (let i = 2; i * i <= max; i++) {
    if (arr[i]) {
      for (let j = i * i; j <= max; j += i) {
        arr[j] = false;
      }
    }
  }

  return arr;
}

const solution = (input) => {
  let result = [];
  let max = Math.max(...input);
  let primeNums = getPrime(max);

  for (let k = 0; k < input.length; k++) {
    let splitted = input[k];
    let count = 0;
    for (let n = 1; n <= splitted / 2; n++) {
      if (primeNums[splitted - n] && primeNums[n]) {
        count++;
      }
    }
    result.push(count);
  }
  return result.join("\n");
};

/* readline Module */
const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];

rl.on("line", function (line) {
  //   input = line; // 입력받은 문자열, line
  //   input = parseInt(line); // 형변환, parseInt
  //   rl.close(); // 입력 종료

  input.push(line.split("\n").map((el) => parseInt(el)));
  //   input.push(line);
}).on("close", function () {
  const [N] = input.shift();

  console.log(solution(input.flat()));

  process.exit(); // 프로세스 종료
});

처음 접근 방법
주어진 숫자 - 소수 = 소수 ---> count ++
위의 소수는 에라토스테네스의 채로 만들어진 소수 배열에서 가져온다.

위에서는 덧셈으로 판별했는데, 위의 로직대로 뺄샘으로 해도 될 것 같다.
뺄셈 연산을 계속 해줘야하는 단점이 있다.

위의 코드대로라면 true/false로 처리해도 처리가 가능할 것이다.

profile
Jr. FE Dev

0개의 댓글