Computer Science/Algorithm

[알고리즘] 재귀 문제 풀이 - javascript

Jiwoo 2022. 8. 2. 11:58

1. 주어진 str를 거꾸로 나열하는 함수를 작성하시오.

ex) 'awesome' => 'emosewa'

 

  • 나의 풀이

    function reverse(str){
    if(str.length === 1) return str;
    return str[str.length-1] + reverse(str.slice(0,-1));
    }
  • 모범 풀이

    function reverse(str){
       if(str.length <= 1) return str;
       return reverse(str.slice(1)) + str[0];
    }

     

2. 문자열을 거꾸로 해도 초기 문자열과 같으면 true, 아니라면 false를 반환하는 함수를 작성하시오.

ex) 'abcba' => true

 

  • 나의 풀이

      function isPalindrome(str){
       function helper(str) {
           if(str.length === 1) return str;
           return str[str.length-1] + helper(str.slice(0,-1));
       }
       if(str === helper(str)) return true;
       return false;
      }
  • 모범 풀이

    function isPlindrom(str) {
       if(str.length === 1) return true;
       if(str.length === 2) return str[0] === str[1];
       if(str[0] === str.slice(-1)) return isPlindrom(str.slice(1,-1))
       return false;
    }

 

3. 배열과 콜백함수를 인자로 받으며, 요소 중 하나라도 콜백함수를 만족하면 true가 도출되는 함수를 작성하시오.

  • 나의 풀이

    function someRecursive(arr, fnc){
      for(let i = 0; i < arr.length; i++) {
         if(fnc(arr[i])) return true;
      }
        return false;
    }
  • 모범 풀이

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

 

4. 배열 안의 배열은 해체하여 기본 배열의 형태를 반환하는 함수를 작성하시오.

ex) flatten([1, 2, 3, [4, 5] ]) // [1, 2, 3, 4, 5]
flatten([1, [2, [3, 4], [[5]]]]) // [1, 2, 3, 4, 5]

 

  • 모범 풀이

    function flatten(oldArr){
     var newArr = []
       for(var i = 0; i < oldArr.length; i++){
           if(Array.isArray(oldArr[i])){
               newArr = newArr.concat(flatten(oldArr[i]))
           } else {
               newArr.push(oldArr[i])
           }
     } 
     return newArr;
    }

 

5. 배열 안의 모든 문자열의 첫번째 문자를 대문자, 나머지를 소문자로 바꾸어 반환하는 함수를 작성하시오.

ex) 'banana' => 'Banana'

 

  • 나의 풀이

     function capitalizeWords (arr) {
       let result = [];
       if(arr.length === 0) return [];
       else result.push(arr[0][0].toUpperCase() + arr[0].slice(1), ...capitalizeFirst(arr.slice(1)))
       return result;
     }
  • 다른 풀이

    function capitalizeFirst (array) {
      if (array.length === 1) {
        return [array[0][0].toUpperCase() + array[0].substr(1)];
      }
      const res = capitalizeFirst(array.slice(0, -1));
      const string = array.slice(array.length - 1)[0][0].toUpperCase() + array.slice(array.length-1)[0].substr(1);
      res.push(string);
      return res;
    }

 

6. 주어진 객체 안에 숨겨진 짝수 값을 모두 더한 결과를 반환하는 함수를 작성하시오.

  • 나의 풀이

    function nestedEvenSum (obj, sum=0) {
    for(let key in obj) {
        if(typeof(obj[key]) === 'object') sum += nestedEvenSum(obj[key]);
        else if(obj[key]) === 'number' && obj[key] % 2 === 0) sum += obj[key];
    }
    return sum;
    }

 

7. 문자열이 담긴 배열이 주어졌을 때, 모든 문자열의 문자를 대문자로 바꾸는 함수를 작성하시오.

ex) ['array', 'john'] => ['ARRAY', 'JOHN']

 

  • 나의 풀이

    function capitalizeWords(arr) {
      let result = [];
      if(arr.length === 0) return [];
      result.push(arr[0].toUpperCase(), ...capitalizeWords(arr.slice(1)));
      return result;
    }
  • 다른 풀이

    function capitalizeWords(arr) {
      if(arr.length === 1) return [arr[0].toUpperCase()];
      let res = capitalizeWords(arr.slice(0,-1));
      res.push(arr[arr.length-1].toUpperCase());
      return res;
    }

 

8. 객체가 인자로 주어질 때, 배열의 모든 '숫자'값을 '문자열'로 바꾸는 함수를 작성하시오.

  • 나의 코드 (실패)

    function stringifyNumbers(obj) {
      for(let key in obj) {
        if(typeof obj[key] === 'object') stringifyNumbers(obj[key]);
        else if(typeof obj[key] === 'number') obj[key] = (obj[key]).toString();
      }
      return obj;
    }

    객체는 참조형 자료이기 때문에 자체를 바꾸지 말고 새로 만들 것
     

  • 모범 풀이

    function stringifyNumbers(obj) {
      const newObj = {};
      for(let key in obj) {
        if(typeof obj[key] === 'number') newObj[key] = (obj[key]).toString();
        else if(typeof obj[key] === 'object' && !Array.isArray(obj[key])) newObj[key] = stringifyNumbers(obj[key]);
        else newObj[key] = obj[key];
      }
      return newObj;
    }

 

9. 객체가 인자로 주어질 때, 객체의 모든 문자열 값을 담은 배열을 반환하는 함수를 작성하시오.

  function collectStrings(obj) {
    let result = [];
    for(let key in obj) {
      if(typeof obj[key] === 'object') result.push(...collectStrings(obj[key]));
      else if(typeof obj[key] === 'string') result.push(obj[key]);
    }
    return result;
  }

 


모든 문제의 출처

Udemy [javascript 알고리즘 & 자료구조]