[알고리즘] 재귀함수 문제 모음

2022. 11. 15. 00:04·개발/알고리즘
728x90
반응형

1. 문자열 거꾸로 만들기

(예시)

console.log(reverse("awesome")); // 'emosewa'
console.log(reverse("rithmschool")); // 'loohcsmhtir'

(코드)

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

2. 문자가 대칭인지 확인하기

(예시)

console.log(isPalindrome("awesome")); // false
console.log(isPalindrome("foobar")); // false
console.log(isPalindrome("tacocat")); // true
console.log(isPalindrome("amanaplanacanalpanama")); // true
console.log(isPalindrome("amanaplanacanalpandemonium")); // false
console.log(isPalindrome("awwa")); // true

(코드)

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

3. 주어진 콜백함수를 만족하는 요소가 있는지 찾기

(예시)

const isOdd = (val) => val % 2 !== 0;
console.log(someRecursive([1, 2, 3, 4], isOdd)); // true
console.log(someRecursive([4, 6, 8, 9], isOdd)); // true
console.log(someRecursive([4, 6, 8], isOdd)); // false
console.log(someRecursive([4, 6, 8], (val) => val > 10)); // false

(코드)

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

4. 배열 벗기기

(예시)

console.log(flatten([1, 2, 3, [4, 5]])); // [1, 2, 3, 4, 5]
console.log(flatten([1, [2, [3, 4], [[5]]]])); // [1, 2, 3, 4, 5]
console.log(flatten([[1], [2], [3]])); // [1,2,3]
console.log(flatten([[[[1], [[[2]]], [[[[[[[3]]]]]]]]]])); // [1,2,3]

(코드)

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

5. 각 배열의 맨 앞글자만 대문자로 쓰기

(예시)

console.log(capitalizeFirst(["car", "taco", "banana"])); // ['Car','Taco','Banana']

(코드)

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. 짝수만 뽑아서 더하기

(예시)

var obj1 = {
  outer: 2,
  obj: {
    inner: 2,
    otherObj: {
      superInner: 2,
      notANumber: true,
      alsoNotANumber: "yup",
    },
  },
};

var obj2 = {
  a: 2,
  b: { b: 2, bb: { b: 3, bb: { b: 2 } } },
  c: { c: { c: 2 }, cc: "ball", ccc: 5 },
  d: 1,
  e: { e: { e: 2 }, ee: "car" },
};

console.log(nestedEvenSum(obj1)); // 6
console.log(nestedEvenSum(obj2)); // 10

(코드)

function nestedEvenSum(obj) {
  let num = 0;
  const keys = Object.keys(obj);
  for (const value of keys) {
    if (obj[value] instanceof Object) {
      num += nestedEvenSum(obj[value]);
    } else {
      if (obj[value] % 2 === 0) {
        num += obj[value];
      }
    }
  }
  return num;
}

7. 숫자 string타입으로 변경하기

(예시)

let obj = {
  num: 1,
  test: [],
  data: {
    val: 4,
    info: {
      isRight: true,
      random: 66,
    },
  },
};

console.log(stringifyNumbers(obj));
/*
{
    num: "1",
    test: [],
    data: {
        val: "4",
        info: {
            isRight: true,
            random: "66"
        }
    }
}
*/

(코드)

function stringifyNumbers(obj) {
  const keys = Object.keys(obj);
  for (let i = 0; i < keys.length; i++) {
    const temp = obj[keys[i]];
    if (temp === +temp) {
      obj[keys[i]] = temp.toString();
    } else {
      stringifyNumbers(obj[keys[i]]);
    }
  }
  return obj;
}

8. string값들만 배열에 넣어주기

(예시)

const obj = {
  stuff: "foo",
  data: {
    val: {
      thing: {
        info: "bar",
        moreInfo: {
          evenMoreInfo: {
            weMadeIt: "baz",
          },
        },
      },
    },
  },
};

console.log(collectStrings(obj)); // ["foo", "bar", "baz"])

(코드)

function collectStrings(obj) {
  const answer = [];
  const keys = Object.keys(obj);
  for (let i = 0; i < keys.length; i++) {
    if (obj[keys[i]] instanceof Object) {
      if (collectStrings(obj[keys[i]]).length) {
        answer.push(...collectStrings(obj[keys[i]]));
      }
    } else {
      answer.push(obj[keys[i]]);
    }
  }
  return answer;
}

 

728x90
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[알고리즘] 버블정렬, 선택정렬, 삽입정렬  (0) 2022.11.17
[알고리즘] 선형검색, 이진검색  (0) 2022.11.15
[알고리즘] 재귀함수  (0) 2022.11.14
[알고리즘] 문제 모음  (0) 2022.11.02
[알고리즘] 연속된 수를 더해서 가장 큰 값 찾기  (1) 2022.11.02
'개발/알고리즘' 카테고리의 다른 글
  • [알고리즘] 버블정렬, 선택정렬, 삽입정렬
  • [알고리즘] 선형검색, 이진검색
  • [알고리즘] 재귀함수
  • [알고리즘] 문제 모음
TeTedo.
TeTedo.
  • TeTedo.
    TeTedo 개발 일기
    TeTedo.
  • 전체
    오늘
    어제
    • 분류 전체보기 (319)
      • 개발 (274)
        • Article (4)
        • 정리 (21)
        • Spring Boot (17)
        • JPA (2)
        • JAVA (6)
        • Database (4)
        • 자료구조 (11)
        • 알고리즘 (32)
        • React (20)
        • Docker (10)
        • node.js (18)
        • Devops (11)
        • Linux (4)
        • TypeScript (3)
        • Go (10)
        • HyperLedger (4)
        • BlockChain (43)
        • html, css, js (48)
        • CS (3)
        • AWS (3)
      • 모아두고 나중에 쓰기 (3)
      • 팀프로젝트 (18)
        • SNS(키보드워리어) (9)
        • close_sea (9)
      • 개인프로젝트 (1)
        • Around Flavor (1)
        • CHAM (13)
        • ethFruitShop (5)
      • 독서 (0)
        • 스프링부트와 AWS로 혼자 구현하는 웹 서비스 (0)
  • 블로그 메뉴

    • 홈
    • 개발일기
    • CS
    • 실습
    • 코딩테스트
    • 웹
    • Go
    • node.js
    • 팀플
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    명령어
    도커
    CSS
    하이퍼레저
    node.js
    프로그래머스
    node
    nodejs
    30일 챌린지
    컨테이너
    erc20
    블록체인
    js
    30일챌린지
    go언어
    mysql
    html
    go
    ERC721
    React
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
TeTedo.
[알고리즘] 재귀함수 문제 모음
상단으로

티스토리툴바