[til] 온도계 구현하기

이진호·2024년 1월 25일
0

TIL

목록 보기
60/66
post-thumbnail
post-custom-banner

문제 정의

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

해결하면서 생각한 내용

무한히 호출하기 때문에 시간이 지남에 따라서 데이터 양이 많아진다

그렇기 때문에 배열을 통해서 구현을 하면 매분마다 계산을 해야하기 때문에 오랜 시간이 걸릴 것이라고 판단하여 2개의 변수로 계산

function calcAverage(sumTemps:number, counter:number) {
  return (sumTemps / counter);
}
const DECIMAL = 2;
const MINUTE = 1000 * 60;

const init = (decimal: number) => {

  let sumTemps = 0;
  let counterOfTemps = 0;

  return (temp: number) => {
    try {
      sumTemps += temp;
      counterOfTemps += 1;
      return calcAverage(sumTemps,counterOfTemps).toFixed(decimal);
    } catch(error) {
      console.error(error);
      return 0;
    }
  }
}  
const getAverage = init(DECIMAL);

setInterval(() => {
  // currentTemp가 일정하게 넘어온다고 가정
  let currentTemp = 0;
  console.log(getAverage(current))
}, MINUTE);

마찬가지로 많은 데이터가 호출이되면 언젠가는 감당할 수 없는 숫자가 나올 것이다.

계속해서 변수에 저장을 하면 변수를 저장할 수 있는 최대 범위가 넘어가서 에러가 발생할 것이다. 따라서 이에 따른 조치를 취해야 한다. 그런데 에러가 발생하면 어떻게 하라는 내용이 없어서 그냥 처음부터 다시 실행하도록 작성했다.

function calcAverage(sumTemps:number, counter:number) {
  return (sumTemps / counter);
}

const DECIMAL = 2;
const MINUTE = 1000 * 60;

const init = (decimal: number) => {
  let sumTemps = 0;
  let counterOfTemps = 0;

  return (temp: number) => {
      sumTemps += temp;
      counterOfTemps += 1;
      return calcAverage(sumTemps,counterOfTemps).toFixed(decimal);
  }
}  

function start() {
  const getAverage = init(DECIMAL);
  let interval = setInterval(() => {
    // currentTemp가 일정하게 넘어온다고 가정
    let currentTemp = 0;
    try {
      console.log(getAverage(currentTemp)); 
    } catch(error) {
      console.error(error);
      clearInterval(interval);
      start();
    }
  },MINUTE);
}
start();

가독성 고려 변수명 변경

function calcAverage(sumTemps:number, counter:number) {
  return (sumTemps / counter);
}

const DECIMAL_PLACE = 2;
const INTERVAL_TIME = 1000 * 60;

const init = (decimal: number) => {
  let sumTemperatures = 0;
  let counterOfTemperatures = 0;

  return (temp: number) => {
      sumTemperatures += temp;
      counterOfTemperatures += 1;
      return calcAverage(sumTemperatures,counterOfTemperatures).toFixed(decimal);
  }
}  


function start() {
  const getAverage = init(DECIMAL_PLACE);
  
  let interval = setInterval(() => {
    // currentTemp가 일정하게 넘어온다고 가정
    let currentTemp = 0;
    try {
      console.log(getAverage(currentTemp)); 
    } catch(error) {
      console.error(error);
      clearInterval(interval);
      start();
    }
  },INTERVAL_TIME);
}
start();
profile
dygmm4288
post-custom-banner

0개의 댓글