재귀 함수

cch_chan·2022년 5월 12일
0

코플릿 재귀함수 이용해서 문제 해결 1,2

문제
선물 상자에 대한 정보를 담은 배열과 문자열을 입력받아 조건에 맞는 선물이 있는지 여부를 리턴해야 합니다.


입력
인자 1 : giftBox
문자열, 배열을 요소로 갖는 재귀적으로 정의된 배열 (입출력 예시 참고)
문자열은 선물 상자에 들어있는 각 선물의 이름을 의미합니다.
배열은 더 작은 선물 상자를 의미합니다.
인자 2 : wish
string 타입의 문자열


출력
boolean 타입을 리턴해야 합니다.


주의 사항
함수 unpackGiftbox는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용이 가능합니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
빈 배열 또는 빈 문자열을 입력받은 경우, false를 리턴해야 합니다.


입출력 예시

const giftBox = ['macbook', 'mugcup', ['eyephone', 'postcard'], 'money'];

let output = unpackGiftbox(giftBox, 'iphone');
console.log(output); // --> false

output = unpackGiftbox(giftBox, 'postcard');
console.log(output); // --> true

내가 생각한 풀이

  • 빈배열일때 false
  • 빈 문자열일때 flase
  • 배열 크기만큼 반복해서 원하는 선물이 있는지 if문 있으면 true;
  • 없다면 배열안에 배열이 있는지 확인 *(isArray()사용)
  • 배열이 있다면 그 배열안에 원하는 선물이 있는지 확인하는 재귀함수 생성해서 있으면 true
  • 이래도 해당없으면 false

코드

function unpackGiftbox(giftBox, wish) {
  // TODO: 여기에 코드를 작성합니다.
  if(giftBox.length===0 || wish==='') return false; // 빈 배열이거나 빈 문자열이면 false

  for(let i =0; i<giftBox.length; i++){
    if(giftBox[i]===wish){
      return true; // 원하는 선물이 있으면 true
    }
    if(Array.isArray(giftBox[i])===true){ //배열안에 배열이 하나 더 있으면 그 배열안에 원하는 선물이 있는지 확인 
      const result = unpackGiftbox(giftBox[i],wish);
      if(result)
        return true; //해당 되면 true
    }
  }
   
  return false //해당 없으면 false
}

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


입력
인자 1 : arr
양의 정수 또는 배열을 요소로 갖는 다차원 배열 (입출력 예시 참고)


출력
배열을 리턴해야 합니다.


주의 사항
함수 flattenArr는 재귀함수의 형태로 작성합니다.
Array Method flat()과 flatMap() 사용은 금지됩니다.
반복문(for, while) 사용이 가능합니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
입력으로 전달되는 다차원 배열이 중첩된 정도(중첩의 깊이)는 정해져 있지 않습니다.
빈 배열을 입력받은 경우, 빈 배열을 리턴해야 합니다.


입출력예시

let output = flattenArr([[1], 2, [3, 4], 5]);
console.log(output); // --> [1, 2, 3, 4, 5]

output = flattenArr([[2, [[3]]], 4, [[[5]]]);
console.log(output); // --> [2, 3, 4, 5]

코드

function flattenArr(arr) {
  // TODO: 여기에 코드를 작성합니다.
  let result=[]; //새로운 배열
  
  for(let i = 0; i<arr.length; i++){
    if(Array.isArray(arr[i])===false){
     result.push(arr[i]);
    }
    else{
      let output = flattenArr(arr[i]);
      result.push(...output)
    }
  }
  return result;
}

풀이
위 문제와 비슷하지만 새로운 배열을 리턴해야하는데 배열 안에 배열을 추가할 때 []가 그대로 출력되서 곤란 했다.
배열안에 다른 배열의 요소를 넣기 위해 Spread Operator 활용하여 배열안에 요소들을 추가 할 수 있다는것을 알게되었습니다.

profile
꾸준히 새로운 기술을 배워나가는중입니다.

0개의 댓글