

특징:
장점:
단점:
적합한 경우:
특징:
장점:
단점:
적합한 경우:
특징:
장점:
단점:
적합한 경우:
| 구분 | 묵시적 가용 리스트 | 명시적 가용 리스트 | 분리 저장 리스트 |
|---|---|---|---|
| 구조 | 모든 블록 순차 탐색 | 가용 블록만 포인터로 연결 | 크기별로 다수의 리스트 유지 |
| 탐색 속도 | 느림 (O(n)) | 빠름 (O(가용 블록 수)) | 매우 빠름 (리스트 하나만 탐색) |
| 공간 효율 | 포인터 공간 없음 | 포인터 공간 필요 | 포인터 + 다수 리스트 공간 필요 |
| 구현 난이도 | 쉬움 | 중간 | 어려움 |
| 단편화 대응 | 낮음 | 중간 | 높음 |
| 사용 사례 | 간단한 할당기 | 성능 요구되는 시스템 | 고성능 할당기, 실무용 (glibc 등) |

const fs = require("fs");
const input = fs.readFileSync("input.txt").toString().split('\n');
// 1. 입력받기
let N = parseInt(input[0]);
let arr = input[1].split(' ').map(Number);
let answer = 0;
// 2. 소수 판별 함수
function is_sosu(num) {
let is_sqrt = true;
if (num == 1) {
is_sqrt = false;
return;
}
for (let i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
is_sqrt = false;
break;
}
}
if (is_sqrt) {
answer++;
}
}
arr.forEach(num => is_sosu(num));
console.log(answer);
모든 수를 소수라고 가정하고 시작.
2부터 시작해서 그 수가 소수이면, 그 수의 배수는 모두 소수가 아님으로 처리
예: 2는 소수니까 4, 6, 8, 10, ... 이런 애들은 전부 소수 아님.
다음 3 → 소수니까 6, 9, 12, ... 전부 제거.
이 과정을 √N까지 반복하면, √N 이상의 수의 배수는 이미 제거되었기 때문에 더 이상 볼 필요 없음.
const fs = require("fs");
const input = fs.readFileSync("input.txt").toString().split('\n');
// 1. 입력받기
let N = parseInt(input[0]);
let arr = input[1].split(' ').map(Number);
// 2. 최대값을 구해서 그까지 체 만들기
let maxNum = Math.max(...arr);
let isPrime = new Array(maxNum + 1).fill(true);
isPrime[0] = false;
isPrime[1] = false;
// 3. 에라토스테네스의 체
for (let i = 2; i <= Math.sqrt(maxNum); i++) {
if (isPrime[i]) {
for (let j = i * i; j <= maxNum; j += i) {
isPrime[j] = false;
}
}
}
// 4. 입력받은 숫자 중 소수인 것만 카운트
let answer = 0;
arr.forEach(num => {
if (isPrime[num]) answer++;
});
console.log(answer);

오랜만에 하려니 입력받기부터 힘드네^^
그림 잘한다