문제
배열을 입력받아 그 길이를 리턴해야 합니다.
인자 1 : arr
임의의 타입을 요소로 갖는 배열
출력
number 타입을 리턴해야 합니다.
arr.length
주의 사항
함수 arrLength는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용은 금지됩니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
arr.length 사용은 금지됩니다.
arr.isEmpty()를 통해 배열이 비어있는지 확인할 수 있습니다.
해당 메소드는 표준 자바스크립트 내장 메소드가 아니며, 문제를 위해 새롭게 정의된 커스텀 메소드입니다. 이 문제에서만 사용하시길 바랍니다.
[ ].isEmpty() === true
[1, 2].isEmpty() === false
빈 배열의 길이는 0입니다.
입출력 예시
let output = arrLength([1, -2, 1, 3]);
console.log(output); // --> 4
답
function arrLength(arr) {
if (arr.isEmpty()){return 0} // base case -arr.isEmpty()가 true면 0 리턴
arr.shift()
return arrLength(arr) +1 // recursive case - 0이 아니면 배열에서 첫 번째 요소를 제거 및 재귀 함수 실행하며 +1
}
ex) arr = [1,2,3]
function arrLength([1,2,3]) {
if ([1,2,3].isEmpty()){return 0}
arr.shift() // [1,2,3].isEmpty()가 false므로 arr.shift()
return arrLength([1,2]) +1 //재귀함수 실행
if ([1,2].isEmpty()){return 0}
arr.shift() // [1,2].isEmpty()가 false므로 arr.shift()
return arrLength([1]) +1 +1 // 재귀함수 실행
if ([1].isEmpty()){return 0}
arr.shift() // [1].isEmpty()가 false므로 arr.shift()
return arrLength([]) +1 +1 +1 // 재귀함수 실행
if ([].isEmpty()){return 0} // isEmpty()가 true므로 0 리턴하며 재귀함수 종료, +1+1+1로 쌓인 값 리턴 = 3
문제
배열을 입력받아 순서가 뒤집힌 배열을 리턴해야 합니다.
입력
인자 1 : arr
임의의 요소를 갖는 배열
출력
순서가 뒤집힌 배열을 리턴해야 합니다.
[arr[n-1], arr[n-2], ... , arr[0]]
arr.length는 n
주의 사항
함수 reverseArr는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용은 금지됩니다.
입력받은 배열은 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
빈 배열은 빈 배열 그대로를 리턴해야 합니다.
입출력 예시
let output = reverseArr([1, 2, 3]);
console.log(output); // --> [3, 2, 1]
답
function reverseArr(arr) {
if (arr.length === 0) {
return []; // base case - arr.length가 0이면 빈 배열 리턴
}
const head = arr[0]; // head는 arr 0번쨰 인덱스
const tail = arr.slice(1); // tail은 arr 0번째 인덱스를 제외한 나머지 배열
return reverseArr(tail).concat(head);
} // recursive case - tail로 재귀함수 실행하며 뒤에 헤드를 합침
ex) arr = [1,2,3,4]
function reverseArr([1,2,3,4]) {
if ([1,2,3,4].length === 0) {
return []; // 0이 아니므로 []를 return하지 않음
}
const head = [1,2,3,4][0]; // head는 [1,2,3,4] 0번쨰 인덱스 = [1]
const tail = arr.slice(1); // tail은 [1,2,3,4] 0번째 인덱스를 제외한 나머지 배열 = [2,3,4]
return reverseArr([2,3,4]).concat([1]);} // 재귀함수 실행
if ([2,3,4].length === 0) {
return []; // 0이 아니므로 []를 return하지 않음
}
const head = [2,3,4][0]; // head는 [2,3,4] 0번쨰 인덱스 = [2]
const tail = arr.slice(1); // tail은 [2,3,4] 0번째 인덱스를 제외한 나머지 배열 = [3,4]
return reverseArr([3,4]).concat([2]).concat([1]);} // 재귀함수 실행
if ([3,4].length === 0) {
return []; // 0이 아니므로 []를 return하지 않음
}
const head = [3,4][0]; // head는 [3,4] 0번쨰 인덱스 = [3]
const tail = arr.slice(1); // tail은 [3,4] 0번째 인덱스를 제외한 나머지 배열 = [4]
return reverseArr([4]).concat([3]).concat([2]).concat([1]);} // 재귀함수 실행
if ([4].length === 0) {
return []; // 0이 아니므로 []를 return하지 않음
}
const head = [4][0]; // head는 [4] 0번쨰 인덱스 = [4]
const tail = arr.slice(1); // tail은 [4] 0번째 인덱스를 제외한 나머지 배열 = []
return reverseArr([]).concat([4]).concat([3]).concat([2]).concat([1]);} // 재귀함수 실행
if ([].length === 0) {
return []; // 0이므로 []를 return하며 재귀함수 종료, concat으로 쌓인 [4,3,2,1] return
}
문제
러시아 전통인형 마트료시카에 대한 정보를 담은 객체와 수를 입력받아 조건에 맞는 인형이 있는지 여부를 리턴해야 합니다.
입력
인자 1 : matryoshka
'matryoshka', 'size' 속성을 갖는 재귀적으로 정의된 객체 (입출력 예시 참고)
matryoshka.matryoshka는 null 또는 matryoshka 객체
matryoshka.size는 중첩될수록 작아집니다.
인자 2 : size
number 타입의 수
출력
boolean 타입을 리턴해야 합니다.
주의 사항
함수 findMatryoshka는 재귀함수의 형태로 작성합니다.
반복문(for, while) 사용은 금지됩니다.
입력받은 객체는 함수의 호출 뒤에도 처음 상태를 유지해야 합니다(immutability).
빈 객체를 입력받은 경우, false를 리턴해야 합니다.
입출력 예시
const matryoshka = {
size:10, matryoshka:{size:9, matryoshka:null,} ,};
let output = findMatryoshka(matryoshka, 10);
console.log(output); // --> true
output = findMatryoshka(matryoshka, 8);
console.log(output); // --> false
답
function findMatryoshka(matryoshka, size) {
if (Object.keys(matryoshka).length ===0){return false} // base case - matryoshka의key값 길이가 0이면 false 리턴 === 빈 객체
if (matryoshka.size === size){return true} // base case = 찾는 size가 있을 경우 true 리턴
if (matryoshka.matryoshka === null){return false} // base case - matryoshka의 값이 null일경우 false 리턴
return findMatryoshka(matryoshka.matryoshka, size) // recursive case - matryoshka.matryoshka로 재귀함수 실행 == matroshka 안에 값으로 matroshka가 있을 경우 실행
}
ex1) a = {
size:10, matryoshka:{size:9, matryoshka:null,} ,};
size = 9
findMatryoshka(a, 9) {
if (Object.keys(a).length ===0){return false} // size, matryoshika로 Object.keys(a).length === 2
if (a.size === 9){return true} // a.size === 10
if (a.matryoshka === null){return false} // a.matryoshika의 값은 {size:9, matryoshka:null,}
return findMatryoshka(a.matryoshka, 9)} a.matryoshika 값으로 재귀함수 실행
if (Object.keys(a.matryoshka).length ===0){return false} // size, matryoshika로 Object.keys(a.matryoshka).length === 2
if (a.matryoshka.size === 9){return true} // a.matryoshka.size === 9므로 true 리턴
ex2) a = {
size:10, matryoshka:{size:9, matryoshka:null,} ,};
size = 6
findMatryoshka(a, 6) {
if (Object.keys(a).length ===0){return false} // size, matryoshika로 Object.keys(a).length === 2
if (a.size === 6){return true} // a.size === 10
if (a.matryoshka === null){return false} // a.matryoshika의 값은 {size:9, matryoshka:null,}
return findMatryoshka(a.matryoshka, 9)} a.matryoshika 값으로 재귀함수 실행
if (Object.keys(a.matryoshka).length ===0){return false} // size, matryoshika로 Object.keys(a.matryoshka).length === 2
if (a.matryoshka.size === 6){return true} // a.matryoshka.size === 6
if (a.matryoshka.matryoshka === null){return false} // a.matryoshika.matryoshka의 값은 null이므로 false 리턴