그림으로 배우는 알고리즘 Basic #4

Kay·2021년 11월 6일
0

4장 기본적인 알고리즘

[36] 1~N 의 합을 구하려면 반복 처리한다

  • 0으로 초기화된 변수 sum에 1~N의 값을 차례대로 더해서 합계를 구한다.
const sumOneToN = (n) => {
  let sum = 0;
  for(let i=1; i<=n; i++) {
    sum += i;
  }
  return sum;
};

[37] 수열의 값을 유지하려면 배열을 사용한다

  • 피보나치 수열은 1번째 요소의 값에 0을, 2번째 요소에 1을, 3번째 이후의 값은 앞의 2칸의 합을 배열에 순서대로 저장해서 구한다.
const getFivo = (n) => {
  let fivo = [0, 1];
  for(let i=2; i<n; i++) {
    fivo[i] = fivo[i-2] + fivo[i-1];
  }
  return fivo;
};

[38] 배열 데이터의 합을 계산하려면 더한 값을 저장할 변수를 준비한다.

  • 배열 요소의 합을 구하는 변수 sum을 준비하고 0으로 초기화 시킨다.
  • 반복 처리 중에 차례대로 더해지는 요소의 값을 구한다.
const arr = [40, 13, 89, 52, 7];
const getSum = (arr) => {
  const reducer = (acc, cur) => { 
    return acc + cur
  };
  return arr.reduce(reducer);
};
console.log(getSum(arr));

👉 reduce 참고

[39] 배열 안의 요소의 개수를 구하려면 카운터를 준비한다

  • 데이터의 개수를 세는 변수 count를 준비하고 0으로 초기화시킨다.
  • 배열 요소가 ‘보초 값’이 아닐 동안 변수 count를 카운트 업 한다.
const getArrayLength = (array) => {
  let count = 0;
  while (true) {
    if (array[count] === -1) {
      break;
    }
    count += 1;
  }
  return count;
};

[40] 배열 데이터의 평균 값은 반복 처리를 통해 합계와 개수를 구한 후 계산한다

  • ‘보초 값’을 찾을 때까지 count(데이터 수)와 sum(합계)를 계산하고, 마지막으로 sum / count 를 계산하여 평균을 구한다.
const getAverage = (array) => {
  let count = 0;
  let sum = 0;
  while (array[count]!== -1) {
    sum += array[count]
    count += 1;
  }
  return (sum/count);
};

[41] 배열의 최대값을 구하려면 최대값을 저장할 변수를 준비한다

  • 변수 max를 비교할 데이터들보다도 작은 값으로 초기화 시킨다.
  • 배열요소의 값 > max이면 max에 배열 요소의 값을 대입한다.
const getMax = (array) => {
  let max = 0;
  for (let i=0; i<array.length; i++) {
    if (array[i] > max) {
      max = array[i];
    }
  }
  return max;
};

[42] 배열의 최소값을 구하려면 최소값을 저장할 변수를 준비한다

  • 변수 min을 비교할 데이터들보다도 큰 값으로 초기화 시킨다.
  • 배열요소의 값 < min이면 min에 배열요소의 값을 대입한다.
const getMin = (array) => {
  let min = 999;
  for (let i=0; i<array.length; i++) {
    if (array[i] < min) {
      min = array[i];
    }
  }
  return min;
};

[43] 배열 데이터에 등수를 매기려면 순위를 저장할 또 다른 배열을 준비한다

  • 1로 초기화 된 배열을 준비하고, 데이터가 저장된 모든 배열 요소와 다른 배열 요소들의 값을 비교한다.
  • 작다면 1을 증가시켜서 등수를 구한다.
const getRankArray = (array) => {
  const rank = array.map(a => {return 1;});
  for(let i=0; i<array.length; i++) {
    for(let j=0; j<array.length; j++) {
      if (array[i] < array[j]) {
        rank[i] += 1;
      }
    }
  }
  return rank;
};

[44] 시간의 크고 작음을 비교하려면 단위를 초단위로 통일한다.

  • 시 → 분 → 초 순으로 크고 작음을 비교할 수도 있지만 조금 복잡해진다.
  • ‘시 분 초'의 크고 작음을 비교하기에 앞서서 단위를 '초’단위로 통일시킨다.
// H1시 M1분 S1초 와 H2시 M2분 S2초 비교
TIME1 = H1*3600 + M1*60 + S1
TIME2 = H2*3600 + M2*60 + S2

if (TIME1 > TIME2) {
  'H1시 M1분 S1초가 더 크다'
} else if (TIME1 < TIME2){
  'H2시 M2분 S2초가 더 크다'
} else if (TIME1 = TIME2){
  'H1시 M1분 S1초와 H2시 M2분 S2초는 같다'
}
 

[45] 시간차를 구할 때는 초단위로 바꾸어 뺄셈하고, 다시 시간으로 바꾼다.

  • 시간차를 구하려면 우선 초 단위 값으로 바꾼다.
  • 시간차를 초 단위로 구하고, 그 값을 다시 ‘시 분 초’로 되돌린다.
// 7시 10분 52초와 14시 20분 50초의 시간차

TIME1 = 7*3600 + 10*60 + 52  // 25852
TIME2 = 14*3600 + 20*60 + 50  // 51650

DIFF = TIME2 -TIME1 // 25798

HOUR = DIFF / 3600  // 7
MINUTE = (DIFF % 3600) / 60  //9
SECOND = ((DIFF % 3600) % 60) / 60  // 58

=> 7시간 958

[46] 두 변수의 값을 교환할 때는 임시 변수를 사용한다.

  • 두 변수의 값을 교환하려면 임시 변수를 사용한다.
  • 먼저 덮어 씌울 변수의 값을 임시 변수에 대피시킨다.
let x = 10;
let y = 25;
let w = y;
y = x;
x = w;

[47] 두 수의 최대공약수는 유클리드 호제법으로 구한다.

  • 유클리드 호제법은 ' x를 y로 나눈 나머지 값을 r이라고 했을 때, x, y의 최대공약수는 y와 r의 최대공약수와 같다'라고 정리한다.
const getGCD = (x, y) => {
  let r;
  while (r != 0) {
    r = x % y;
    x = y;
    y = r;
  }
  return x;
}
profile
new blog✨ https://kay-log.tistory.com/

0개의 댓글