알고리즘

[재귀] someRecursive

selonjulie 2022. 10. 31. 00:21

문제 

Write a recursive function called someRecursive which accepts an array and a callback. The function returns true if a single value in the array returns true when passed to the callback. Otherwise it returns false.

 

배열과 콜백을 받는 someRecursive라는 재귀 함수를 작성하십시오. 콜백에 전달할 때 배열의 단일 값이 true를 반환하면 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

 

// SAMPLE INPUT / OUTPUT
// const isOdd = val => val % 2 !== 0;

// someRecursive([1,2,3,4], isOdd) // true
// someRecursive([4,6,8,9], isOdd) // true
// someRecursive([4,6,8], isOdd) // false
// someRecursive([4,6,8], val => val > 10); // false

 

문제대로 함수의 형태 만들어보기

배열과 콜백을 받는 someRecursive라는 재귀 함수를 작성하십시오. 

function someRecursive(array, callback){}

콜백에 전달할 때 배열의 단일 값이 true를 반환하면 함수는 true를 반환합니다. 그렇지 않으면 false를 반환합니다.

function someRecursive(array, callback){
    if(callback(array[?])) return true;
    return false;
}

 

재귀의 관점으로 문제를 바라보기

2022.08.15 - [알고리즘] - Recursion 재귀

1. Base Case(종료조건)

종료 조건 추가하기 : 배열이기 때문에 배열의 요소가 존재하지 않을 때 (0일 때) false를 반환

if(arr.length === 0) return false;

2. Different input

'그렇지 않으면 false를 반환합니다.'에서 '그렇지 않으면'의 경우에 재귀를 대입하여 값을 반환한다.

입력 값 중에서 배열의 첫번째 값이 계속 바뀌어야 하니까 배열의 첫번째 요소를 잘라준다.

return someRecursive(array.slice(1), callback);

 

해결방법

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

여기에서 나는 slice 대신 shift를 써주었다. shift는 잘린 '배열'이 아닌 '요소'가 나오는 특성을 이해하지 못하여 문제를 풀지 못했다. 

2022.10.30 - [Javascript] - [배열 다루기] shift와 slice의 차이점

이후 그 특성을 안 후 푼 해결방법은 아래와 같다. 

 

내가 푼 방법

function someRecursive(array, callback){
  if(array.length === 0) return false;
  let arrElement = array.shift();
  if(callback(arrElement)) return true;
  return someRecursive(array, callback);
}

 

느낀점

배열 자체를 반환하고 싶을 땐 slice를 사용하고, 배열의 요소를 반환하고 싶을땐 shift를 쓰기

문제를 읽으면서 그대로 함수의 형태를 만들어 보기

'알고리즘' 카테고리의 다른 글

[Elementary Sorting Algotithms] Bubble sort  (0) 2022.11.20
Searching algorithme  (0) 2022.11.13
재귀: recursive range, Fib  (0) 2022.10.02
재귀: power 제곱, factorial 계승  (0) 2022.09.03
Recursion 재귀  (0) 2022.08.15