[BOJ] 4134. 다음소수(javascript)

레몬커드요거트·2026년 3월 18일

코딩테스트준비

목록 보기
23/66
post-thumbnail

성공 코드

const fs = require("fs");
const input = fs
  .readFileSync(process.platform === "linux" ? "/dev/stdin" : "input.txt")
  .toString()
  .trim()
  .split("\n");

const N = input[0];

let result = [];

function isPrime(num) {
  if (num < 2) return false;
  for (let i = 2; i * i <= num; i++) {
    if (num % i == 0) return false;
  }
  return true;
}

for (let i = 1; i <= N; i++) {
  let num = Number(input[i]);
  while (true) {
    if (isPrime(num)) {
      result.push(num);
      break;
    }
    num++;
  }
}
console.log(result.join("/n"));

잘못작성한 while문 - 무한루프

  while (true) {
    let smallestPrime = num;
    isPrime(smallestPrime);
    if (isPrime(smallestPrime) === false) {
      smallestPrime++;
    } else {
      result.push(smallestPrime);
      break;
    }
  }

while(true) 안에서 let smallestPrime = num;을 매번 초기화하고 있다는 점입니다. 이렇게 되면 smallestPrime이 증가하지 못하고 계속 제자리걸음

사용한 알고리즘

1. 브루트 포스 (Brute Force / 완전 탐색)

while(true) 문을 사용해 "소수를 찾을 때까지 1씩 더하며 전부 확인한다"는 방식입니다.
특별한 수학적 공식으로 한 번에 다음 소수를 알아내는 것이 아니라, 조건에 맞을 때까지 하나하나 대입해 보는 가장 직관적인 방법입니다.

2. 제곱근을 이용한 소수 판별법 (Primality Test)

isPrime 함수 내의 i * i <= num (또는 inumi \le \sqrt{num}) 부분이 이 알고리즘의 핵심입니다.

  • 원리: 어떤 수 nn이 소수가 아니라면, n=a×bn = a \times b로 나타낼 수 있습니다. 이때 a와 b 중 적어도 하나는 반드시 n\sqrt{n}보다 작거나 같습니다.
  • 효율성: 예를 들어 n=100n = 100일 때, 100까지 나누어 떨어지는지 확인하는 대신 100=10\sqrt{100} = 10까지만 확인해도 소수인지 아닌지 완벽하게 판별할 수 있습니다.
  • 시간 복잡도: 숫자 하나를 판별하는 데 O(N)O(\sqrt{N})의 시간이 걸립니다.

BigInt써야하는가?

JavaScript에서 일반적인 Number 타입은 약 9×10159 \times 10^{15}(25312^{53}-1)까지 안전하게 표현할 수 있다.

40억은 Number 범위 안에 들어가므로, 일단은 BigInt를 쓰지 않고 일반 숫자형으로 풀어도 계산이 정확함

profile
비요뜨 최고~

0개의 댓글