Day 4배열 기초

JS 배열은 크기 고정이 아니고 타입도 안 섞어도 되는 동적 배열이다(내부적으로는 최적화를 위해 타입이 균일할 때 더 빠르다). Rust의 Vec보다 훨씬 느슨하다.

1. 생성과 인덱싱

const temps = [52.3, 67.8, 81.2, 60.0];
temps[0]           // 52.3
temps.length         // 4
temps[temps.length - 1]  // 81.2, 마지막 원소
temps[99]              // undefined, 범위 밖은 에러 없이 undefined

2. 끝/앞 조작 — push/pop/shift/unshift

temps.push(90.1);     // 끝에 추가, 새 length 리턴
temps.pop();            // 끝에서 제거하고 그 값 리턴
temps.unshift(40.0);    // 앞에 추가 (느림 — 모든 원소를 밀어야 함)
temps.shift();            // 앞에서 제거

3. slice vs splice — 헷갈리기 쉬운 짝

slice(start, end)는 원본을 안 건드리고 새 배열을 리턴. splice(start, deleteCount, ...items)는 원본을 직접 수정한다.
const temps = [52.3, 67.8, 81.2, 60.0, 65.0];

temps.slice(1, 3)      // [67.8, 81.2] — 원본 그대로
temps.slice(-2)         // [60.0, 65.0] — 뒤에서 2개

const removed = temps.splice(1, 2);   // 원본에서 index 1부터 2개 제거
// temps는 이제 [52.3, 60.0, 65.0], removed는 [67.8, 81.2]

temps.splice(1, 0, 99);   // 삭제 0개, index 1에 99 삽입

4. 검색

temps.includes(60.0)      // true — 존재 여부만 필요할 때
temps.indexOf(60.0)          // 몇 번째인지 필요할 때, 없으면 -1
Array.isArray(temps)           // true — typeof는 배열도 "object"라서 못 씀

🎯 실습 과제 — _submissions/day04.js

과제 1. 최근 N개

function lastN(readings, n) {
  // TODO: 배열 끝에서 n개를 새 배열로 리턴 (원본 훼손 금지)
}
// lastN([1,2,3,4,5], 2) → [4, 5]
// lastN([1,2,3], 10)      → [1, 2, 3]  (n이 더 커도 에러 없이)

과제 2. 이상치 제거
0°C 미만이거나 120°C 초과인 값은 센서 오류로 간주하고 제거하는 removeOutliers(readings)를 작성한다. 원본 배열은 건드리지 말고 새 배열을 리턴한다.

// removeOutliers([52.3, -5, 67.8, 999, 60.0]) → [52.3, 67.8, 60.0]

과제 3. 특정 구간 교체
splice를 이용해 replaceRange(arr, start, count, ...values)를 작성한다 — arrstart부터 count개를 values로 교체하고, 원본 배열을 그대로 리턴한다(원본 수정 O, 이번엔 의도적으로).

// replaceRange([1,2,3,4,5], 1, 2, 9, 9, 9) → [1, 9, 9, 9, 4, 5]

과제 4 (도전). 슬라이딩 윈도우 평균
windowAverage(readings, size): 배열을 size 크기 구간으로 나눠서(마지막에 딱 안 맞으면 남는 만큼만) 각 구간의 평균을 담은 배열을 리턴한다.

// windowAverage([10,20,30,40,50], 2) → [15, 35, 50]
✅ 다 작성했으면:
cd ~/Documents/javascript-2주완성
bun _grade.ts day04