본문 바로가기
코테연습

113. 백준 : 2960 에라토스테네스의 체 Javascript

by hxunz 2022. 9. 9.

https://www.acmicpc.net/problem/2960

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - N, K가 주어졌을 때, K번째 지우는 수를 구하라
  • 주어진 자료는 무엇인가?
     - N = 정수
     - K = 정수
  • 조건은 무엇인가?
     - 1 ≤ K < N, max(1, K) < N ≤ 1000

2. 계획

  1. 2부터 N까지 모든 정수를 적는다.
  2. 아직 지우지 않은 수 중 가장 작은 수를 찾는다. 이것을 P라고 하고, 이 수는 소수이다.
  3. P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.
  4. 아직 모든 수를 지우지 않았다면, 다시 2번 단계로 간다.

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (n, k) => {
  // 2부터 N까지 모든 정수를 적는.다
  let numbers = [];
  for (i = 2; i <= n; i++) {
    numbers.push(i)
  }

  // 아직 지우지 않은 수 중 가장 작은 수를 찾는다.이것을 P라고 하고, 이 수는 소수이다.
  let p = numbers[0];
  let count = 0; 
  let prime = [];

  // P를 지우고, 아직 지우지 않은 P의 배수를 크기 순서대로 지운다.
  while (numbers.length > 0) {
    if (count > k) {
      break;
    }

    prime.push(p);
    let num = numbers[0];
    numbers[0] = null;
    count = count + 1;
    if (count === k) {
      return num
    }

    for (i = 1; i * p < numbers.length; i++) {
      const number = numbers[i * p]
      numbers[i * p] = null;
      count = count + 1;

      if (count === k) {
        return number;
      }
    }
    numbers = numbers.filter((it) => it !== null);

    p = numbers[0];
  }
  return p;
}

4. 반성

  • 배열이 아닌 객체를 사용해서 풀어볼 수도 있을 것 같다.

 

댓글