[45일차] 재귀연습문제2

저요·2022년 11월 6일

2022 100th day challenge

목록 보기
45/97

문제&솔루션

문제1 someRecursive

배열과 callback함수를 받고 true, false를 반환하시오

function someRecursive(arr, callback){
  if(arr.length === 0) return false;
  if(callback(arr[0])) return true;
  return someRecursive(arr.slice(1), callback);
}

callback함수란?

callback 함수는 파라미터로 함수를 전달받아 함수 내부에서 실행하는 것을 말한다.

someRecursive에서는 예제로 배열안에 홀수가 있는지를 판단하는 isOdd나 배열안에 특정 수보다 큰 수가 있는지를 판단하는 함수를 예제로 제시했고, 그래서 다음과 같이 배열을 왼쪽에서 오른쪽으로 하나하나 뜯어보며 안에 callback함수의 true를 만족하는 것이 있는지를 판단했다.
해당 문제에서 나의 솔루션과 해답 솔루션이 거의 일치하기 때문에 해답솔루션을 소개하는 것은 스킵하도록 하겠다.

문제2 flatten

다차원 배열을 인자로 받고 1차원 배열로 반환하시오.

두번째 문제는 다차원 배열을 1차원 배열로 반환하는 문제이다. 이 문제에서 꽤 오랬동안 고전했었다.
첫번째로 내가 낸 솔루션은 간단하게 slice를 이용하는 방법이었다. 일정한 다차원 배열이어다면 이 방법이 유효했을지도 모르지만, 예시에서 입력값으로 제시된 배열은 다음과 같았다.

let arr = [1 , 2 , 3 , [4 , 5]];

이렇게 불규칙한 배열이 나왔을 경우에는 slice를 쓰는건 부적합하다고 생각했다.
이 문제를 풀기 위해서는 모든 배열을 처음부터 하나하나 비교하면서 그것이 만약 array이라면 다시 재귀함수를 호출하며 배열이 아닐때까지 비교한 뒤에 새로운 배열에 넣도록 해야했다.

  //배열의 0 부터 길이가 0이 될때까지 비교한 뒤에 다음으로 넘어갈 수 있도록 한다.
  for(let i = 0; i<oldArr.length; i++){
      //i번째가 Array이인지 아닌지를 판단
      if(Array.isArray(oldArr[i])){
          //만약 array라면 함수를 재귀호출하여 다시 비교 > array가 아닐때까지 
          newArr = newArr.concat(flatten(oldArr[i]));
      }else{
          newArr.push(oldArr[i]);
      }
  }

해답 솔루션을 많이 참고했기 때문에 또 따로 설명하지는 않겠다.

출처

https://www.udemy.com/share/105zfq3@AOkmRvz2kg_vrW8EELbIa_TCEndxSJ2Rvnua64Lg2GEEQ0DzEA0mwadxV-TSs7tCqQ==/

profile
웹개발

0개의 댓글