재귀에 대해 학습한 후 페어와 함께 재귀함수 코플릿 문제를 풀었다. 재귀는 재귀는 언제 사용하는 게 좋을까?
1. 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
2. 중첩된 반복문이 많거나 반복문의 중첩 횟수(number of loops)를 예측하기 어려운 경우
에 사용하기 좋다고 한다.오늘은 재귀 문제를 풀면서 고민을 했던 문제를 적어보려고 한다.
선물 상자에 대한 정보를 담은 배열과 문자열을 입력받아 조건에 맞는 선물이 있는지 여부를 리턴해야 합니다.
인자 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코드를 입력하세요
function unpackGiftbox(giftBox, wish) {
//base case를 작성한다.
if(giftBox.length === 0){
return false
}
//giftbox가 배열이므로 각각 조회하기 위해 for문을 이용해 giftbox.length까지 돌린다.
for(let i =0; i < giftBox.length; i++){
//만약 giftbox의 i번째 index에 wish가 있다면 true를 리턴한다.
if(giftBox[i] === wish){
return true
}
//giftBox[i]가 배열일시 재귀함수로 호출해준다.
if(Array.isArray(giftBox[i])){
let temp = unpackGiftbox(giftBox[i], wish)
//wish가 발견된다면 true를 리턴한다.
if(temp ){
return true
}
}
}
return false
}코드를 입력하세요
재귀 문제를 풀면서 내가 이해를 진짜 한건지 외워서 적는건지 헷갈린다 ^^하하하.. 오늘 푼 문제를 다시 처음부터 풀어봐야겠다.