코린이에서 코른이로 ( 재귀 함수 코플릿 )

양선우·2023년 2월 14일
0

재귀함수 코플릿을 풀면서 내가 막혔었던 문제들을 다시 복기하며 블로깅 해보려 한다.

문제

배열을 입력받아 그 길이를 리턴해야 합니다.

입력
인자 1 : arr
임의의 타입을 요소로 갖는 배열
출력
number 타입을 리턴해야 합니다.
arr.length
주의 사항
함수 arrLength는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용은 금지됩니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
arr.length 사용은 금지됩니다.
arr.isEmpty()를 통해 배열이 비어있는지 확인할 수 있습니다.
해당 메소드는 표준 자바스크립트 내장 메소드가 아니며, 문제를 위해 새롭게 정의된 커스텀 메소드입니다. 이 문제에서만 사용하시길 바랍니다.
[ ].isEmpty() === true
[1, 2].isEmpty() === false
빈 배열의 길이는 0입니다.
입출력 예시
1 let output = arrLength([1, -2, 1, 3]);
2 console.log(output); // --> 4

내가 작성한 Code

function arrLength(arr) {
  // TODO: 여기에 코드를 작성합니다.
  if (arr.isEmpty(arr)=== true ){ // arr이 빈 배열이 true 면
    return 0 // 리턴 0 Base Case
  }
const result = arr.slice(1); // arr배열의1을 result로

  return 1 + arrLength(result); // 1+ result Recusion Case
}

Reference Code

function arrLength(arr) {
  if (arr.isEmpty()) {
    return 0;
  }

  // const [head, ...tail] = arr;
  const tail = arr.slice(1);
  return 1 + arrLength(tail);
}

문제

배열을 입력받아 순서가 뒤집힌 배열을 리턴해야 합니다.

입력
인자 1 : arr
임의의 요소를 갖는 배열
출력
순서가 뒤집힌 배열을 리턴해야 합니다.
[arr[n-1], arr[n-2], ... , arr[0]]
arr.length는 n
주의 사항
함수 reverseArr는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용은 금지됩니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
빈 배열은 빈 배열 그대로를 리턴해야 합니다.
입출력 예시
1 let output = reverseArr([1, 2, 3]);
2 console.log(output); // --> [3, 2, 1]

내가 작성한 Code

function reverseArr(arr) {
  // TODO: 여기에 코드를 작성합니다.
     if(arr.length === 0){ //arr배열의 길이가 0이면 
       return []; //빈 배열을 리턴 Base Case
  } 
  const head = arr[arr.length-1]; // head를 선언하고 head는 arr배열의 마지막요소
  const tail = arr.slice(0,arr.length-1); // arr배열의 0번째 인덱스를 마지막에 넣는다
  return [head].concat(reverseArr(tail)) // Recusion Case
}

Reference Code

function reverseArr(arr) {
  if (arr.length === 0) {
    return [];
  }

  // const [head, ...tail] = arr;
  const head = arr[0];
  const tail = arr.slice(1);
  return reverseArr(tail).concat(head);
}

문제

다차원 배열을 입력받아 1차원 배열로 변환하여 리턴해야 합니다.

입력
인자 1 : arr
양의 정수 또는 배열을 요소로 갖는 다차원 배열 (입출력 예시 참고)
출력
배열을 리턴해야 합니다.
주의 사항
함수 flattenArr는 재귀함수의 형태로 작성합니다.
Array Method flat()과 flatMap() 사용은 금지됩니다.
반복문(for, while) 사용이 가능합니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
입력으로 전달되는 다차원 배열이 중첩된 정도(중첩의 깊이)는 정해져 있지 않습니다.
빈 배열을 입력받은 경우, 빈 배열을 리턴해야 합니다.
입출력 예시
1 let output = flattenArr([[1], 2, [3, 4], 5]);
2 console.log(output); // --> [1, 2, 3, 4, 5]
3 
4 output = flattenArr([[2, [[3]]], 4, [[[5]]]]);
5 console.log(output); // --> [2, 3, 4, 5]

내가 작성한 Code

function flattenArr(arr) {
  // TODO: 여기에 코드를 작성합니다.
const result = []; // 빈 배열을 선언하고
for(let i=0; i<arr.length; i++){ // 반복문을 돌려서
if(Array.isArray(arr[i])){ // arr[i] 인덱스가 배열이면
  const arr1 = flattenArr(arr[i]) //  arr1을 선언하고 arr[i] 인덱스를 빼서
  result.push(...arr1); //result에 푸시해준다
}else{ // 그렇지 않다면
  result.push(arr[i])  // result에 arr[i]를 푸시한다 Base Case
}
}return result; // Recusion Case
}

Reference Code

function flattenArr(arr) {
  // base case
  if (arr.length === 0) {
    return [];
  }

  // recursive case
  const head = arr[0];
  const tail = arr.slice(1);
  if (Array.isArray(head)) {
    return flattenArr([...head, ...tail]);
  } else {
    return [head].concat(flattenArr(tail));
  }
}
profile
코딩이 하고 싶은 사람

0개의 댓글