온도계 문제

상현·2024년 1월 25일

내일배움캠프 멘토링 시간에서 멘토님께서 온도계 문제라는 과제를 내어 주셨다. 다음과 같은 조건을 가지는 함수를 작성하면 된다.

  • 매 1분마다 실행되는 함수 생성
  • 함수는 호출될때마다 온도 값이(num) 인풋된다
  • 함수는 호출될때마다 지금까지 받은 온도의 평균 온도 값을 내보낸다.
  • 호출은 무한으로 호출된다.
  • 디비에 값 저장 불러오기 X
  • 자바스크립트 또는 타입스크립트로 실행
  • setInterval로 실행되도 무관, 혹은 cronjob이 실행시킨다고 가정해도 무방

내가 푼 풀이

const Thermometer = (() => {
  let sum = 0;
  let length = 0;
  let interval = null;

  // 온도를 더한 뒤 평균을 알려줍니다.
  const getAverage = (temp) => {
    sum += temp;
    length++;
    const avg = sum / length;
    console.log(`${new Date().toLocaleTimeString()} - 현재  평균 온도는 : ${avg}`);
    return avg;
  };

  // 현재 온도를 어디선가 가져옵니다...
  const getCurrentTemperature = () => {
    const temperature = Math.random() * 100;
    return temperature;
  };

  // 00초 부터 시작됩니다.
  const start = (intervalTime = 60000) => {
    if (!interval) {
      const now = new Date();
      setTimeout(
        () => {
          interval = setInterval(() => {
            getAverage(getCurrentTemperature());
          }, intervalTime);
        },
        59000 - now.getSeconds() * 1000
      );
    }
  };

  const close = () => {
    if (interval) {
      console.log("타이머를 종료합니다.");
      clearInterval(interval);
      interval = null;
    }
  };

  return {
    start,
    close,
  };
})();

// Thermometer.start();
Thermometer.start(1000); // 테스트용 1초 간격 실행

우선 클로저를 이용하여 어디서 호출하더라도 같은 값을 볼 수 있도록 했고, 함수를 실행하는데 필요한 start, close 메서드만 내보냈다.
또한 단순히 평균값만 내보내면 되므로 굳이 들어오는 온도 값들을 저장하지 않고 평균을 계산하는데 필요한 sumlength 만 업데이트 해주는 방향으로 했다.

profile
블로그 이전 => https://shdev.blog/

0개의 댓글