백준 1644 소수의 연속합 (투포인터)

bkboy·2022년 6월 14일
0

백준 초급

목록 보기
59/80

문제

제한 사항

입출력 예

풀이

let input = require('fs').readFileSync('/dev/stdin').toString().trim();

const isPrime = (n) => {
  if (n === 1 || n === 0) return false;
  if (n === 2) return true;
  for (let i = 2; i <= Math.ceil(Math.sqrt(n)); i++) {
    if (n % i === 0) {
      return false;
    }
  }

  return true;
};

const sol = (input) => {
  let cnt = 0;
  const N = +input;
  const arr = new Array(N + 1)
    .fill(0)
    .map((e, i) => (e = i))
    .filter((e) => isPrime(e));

  let lt = 0;
  let rt = 1;
  let sum = arr[lt];
  while (lt < arr.length && rt < arr.length) {
    if (sum === N) {
      cnt++;
      sum += arr[rt++];
    } else if (sum > N) {
      sum -= arr[lt++];
    } else {
      sum += arr[rt++];
    }
  }
  if (arr[arr.length - 1] === N) {
    cnt++;
  }
  return cnt;
};

console.log(sol(input));
  • 아래 코드론 해결이 안됐는데 왜 그런지 모르겠다.
let input = require('fs').readFileSync('/dev/stdin').toString().trim();

const isPrime = (n) => {
  if (n === 1) return false;
  if (n === 2) return true;
  for (let i = 2; i <= Math.ceil(Math.sqrt(n)); i++) {
    if (n % i === 0) {
      return false;
    }
  }

  return true;
};

const sol = (input) => {
  let cnt = 0;
  const N = +input;
  const arr = new Array(N + 1)
    .fill(0)
    .map((e, i) => (e = i))
    .filter((e) => isPrime(e));

  let lt = (rt = 0);
  let sum = 0;
  while (lt < arr.length && rt < arr.length) {
    sum += arr[rt++];
    if (sum === N) {
      cnt++;
    }
    while (sum >= N) {
      sum -= arr[lt++];
      if (sum === N) {
        cnt++;
      }
    }
  }
  return cnt;
};

console.log(sol(input));
profile
음악하는 개발자

0개의 댓글