[Daily Coding 3]reduce/while/배열

hameee·2022년 12월 10일
0

Daily Coding

목록 보기
3/10

1.reduce

주의1. 가장 긴 문자열을 구할 경우

-> 가장 긴 문자열을 담는 변수를 따로 만들지 않아도 됨

// Q. 문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열을 리턴해야 합니다.

// A.
function getLongestElement(arr) {
  return arr.reduce((acc, cur) => {
    if (acc.length < cur.length) {
      return cur; // cur의 길이가 더 길면 acc를 cur으로 교체
    }
    return acc;// 그렇지 않다면 acc를 그대로 유지
  }, '')
}

주의2. 필터링이 필요한 경우

-> reduce 밖에서 filter 사용 or reduce 안에서 조건문 사용

// Array.filter 사용
function sumOfArraysInArray(arr) {
  const joinedArr = arr.reduce(function (acc, cur) {
    return acc.concat(cur);
  });

  const onlyNumbers = joinedArr.filter(function (el) {
    return typeof el === 'number';
  });

  return onlyNumbers.reduce(function (acc, cur) {
    return acc + cur;
  }, 0);
}

// Array.reduce 안에서 조건문 사용
function sumOfArraysInArray(arr) {
  let newArr = arr.reduce((acc, cur) => {
    return acc.concat(cur);
  }, []);

  return newArr.reduce((acc, cur) => {
    if (typeof cur === 'number') {
      return acc + cur;
    }
    return acc;
  }, 0)
}

주의3. 하나라도 조건에 맞지 않으면 false를 반환해야 하는 경우

->기본값 true, 조건에 맞지 않을 때 false로 바꿔줌

// Q.수를 요소로 갖는 배열을 입력받아 각 요소가 그 이전의 요소들의 합보다 큰지 여부를 리턴해야 합니다.

// A.
function superIncreasing(arr) {
  let result = true;
  arr.reduce((acc, cur) => {
    if (acc >= cur) {
      result = false;
    }
    // 한번 false가 되면 다시 true로 바꿔주는 명령문이 없으므로
    // 하나라도 조건에 맞지 않으면 false 반환
    return acc + cur;
  })
  return result;
}

주의4. acc, cur에 무엇이 들어가는지 생각 -> 변수 부족하면 추가로 생성

ex. 주의3의 예제
acc: acc + cur
cur: 배열 요소
result: true/false

2.while

무한루프 조심(num2 = 0이면 무한루프)

function modulo(num1, num2) {
  if(num2 === 0) {
    return 'Error: cannot divide by zero';
  }
  // 조건이 true이면 계속 돌아라
  // false이면 다음 코드로 이동
  while(num1 >= num2) {
    num1 = num1 - num2;
  }
  return num1;
}

3.배열에 저장소 만들기

// Q. 문자열을 요소로 갖는 배열을 입력받아 문자열을 세로로 읽었을 때의 문자열을 리턴해야 합니다.

// A.
// 조건에 따라 배열에 추가
function readVertically(arr) {
  // 빈 배열에 인덱스가 같은 것끼리 모음
  let newArr = [];
  for(i = 0; i < arr.length; i++) {// arr = [hi, world, hello]
    for (j = 0; j < arr[i].length; j++) {// newArr = [hwh, ioe, rl, ll, do]
      if (!newArr[j]) {
        newArr.push(arr[i][j]); 
      } else {
        newArr[j] = newArr[j] + arr[i][j];
      }
    }
  }
  //합침
  return newArr.join('');// 'hwhioerllldo'
}
// Q. 문수를 입력받아 제곱근 값을 소수점 두 자리까지 리턴해야 합니다. Math.sqrt 사용은 금지됩니다.

// A.
// 적용하고 싶은 것을 미리 배열에 담아 놓음
function computeSquareRoot(num) {
  const diffs = [1, 0.1, 0.01, 0.001];
  let base = 1;
  for (let i = 0; i < diffs.length; i++) {
    while (base * base < num) {
      base = base + diffs[i];
    }

    if (base * base === num) {
      return base;
    } else {
      base = base - diffs[i];
    }
  }
  return Number(base.toFixed(2));
}

0개의 댓글