Day 7[프로젝트] 온도 로그 분석기

1주차 마무리 프로젝트. 지금까지 배운 조건문, 함수, 배열 메서드, 객체 구조분해를 전부 동원해서 check_state.sh가 할 법한 일을 JS로 만든다. 새 문법은 없다 — 조합만 있을 뿐.

새 개념 없음. 오늘은 Day 2~6 내용을 그대로 써서 실전 크기의 데이터를 다룬다.

데이터

아래 로그를 _submissions/day07.js 파일 맨 위에 그대로 선언하고 시작한다.

const log = [
  { time: "06:00", tempC: 48.2, voltage: 5.05, throttled: false },
  { time: "07:00", tempC: 51.0, voltage: 5.04, throttled: false },
  { time: "08:00", tempC: 55.6, voltage: 5.03, throttled: false },
  { time: "09:00", tempC: 60.1, voltage: 5.02, throttled: false },
  { time: "10:00", tempC: 66.4, voltage: 4.99, throttled: false },
  { time: "11:00", tempC: 70.8, voltage: 4.97, throttled: false },
  { time: "12:00", tempC: 74.3, voltage: 4.95, throttled: false },
  { time: "13:00", tempC: 81.2, voltage: 4.90, throttled: true  },
  { time: "14:00", tempC: 84.7, voltage: 4.88, throttled: true  },
  { time: "15:00", tempC: 79.9, voltage: 4.91, throttled: false },
  { time: "16:00", tempC: 73.1, voltage: 4.96, throttled: false },
  { time: "17:00", tempC: 68.5, voltage: 4.98, throttled: false },
  { time: "18:00", tempC: 63.0, voltage: 5.00, throttled: false },
  { time: "19:00", tempC: 58.4, voltage: 5.02, throttled: false },
  { time: "20:00", tempC: 88.1, voltage: 4.85, throttled: true  },
  { time: "21:00", tempC: 65.0, voltage: 4.99, throttled: false },
  { time: "22:00", tempC: 54.2, voltage: 5.04, throttled: false },
  { time: "23:00", tempC: 49.9, voltage: 5.05, throttled: false },
];

🎯 실습 과제 — _submissions/day07.js

과제 1. computeStats(log)
{ avg, max, min }을 리턴한다. 셋 다 소수점 첫째 자리까지 반올림된 숫자(number, 문자열 아님).

과제 2. findWarnings(log)
tempC >= 65인 항목만 배열로 리턴한다 (entry 객체 그대로, time만 뽑지 않는다).

과제 3. countThrottled(log)
throttled === true인 항목 개수를 리턴한다.

과제 4. printReport(log) — 종합
위 세 함수를 조합해서 console.log로 다음 정확한 형식으로 출력한다 (경고 항목은 온도 내림차순 정렬, 각 줄 앞에 상태 라벨을 붙인다: 80 이상 "위험", 그 외 "경고"):

=== berry 온도 로그 리포트 ===
평균: 68.4°C
최고: 88.1°C
최저: 48.2°C
경고 이상 항목: 8건
  [20:00] 88.1°C (위험)
  [14:00] 84.7°C (위험)
  [13:00] 81.2°C (위험)
  [15:00] 79.9°C (경고)
  [12:00] 74.3°C (경고)
  [16:00] 73.1°C (경고)
  [11:00] 70.8°C (경고)
  [17:00] 68.5°C (경고)
쓰로틀링 발생: 3회

숫자가 안 맞아도 로직(정렬 방향, 라벨 판정, 필터 기준)이 맞으면 부분 점수를 준다 — 채점기가 계산까지 검증하진 않고 코드 로직을 검토한다.

과제 5 (도전). 연속 위험 구간 탐지
findDangerStreaks(log): tempC >= 80인 항목이 연속으로 2개 이상 나타나는 구간들을 찾아서, 각 구간의 시작/끝 시간을 [{ from, to }] 배열로 리턴한다.

// 위 데이터에서 → [{ from: "13:00", to: "14:00" }]
✅ 다 작성했으면:
cd ~/Documents/javascript-2주완성
bun _grade.ts day07
1주차 끝! 여기까지 왔으면 이미 "JS를 읽을 수 있는" 수준은 넘었다. 2주차부터는 브라우저(DOM)와 비동기로 넘어간다.