inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자료구조 알고리즘 2주차

메옹
0

재귀 (Recursion)

재귀 구현

const myFunc = (number) => {
  if (number > 10) return;
  console.log(number);
  myFunc(number + 1);
};

myFunc(1);

종료가 없는데 자동으로 실행이 종료된 이유?

콜스택의 개념

재귀를 사용하는 이유


재귀적으로 생각하기

재귀의 여러 가지 패턴 분석하기

어떤 종류의 재귀 함수인지 구분하기

const power = (x, n) => {
  if (n === 0) return 1;

  return power(x, n - 1) * x;
};

console.log(power(2, 5));
const strLength = (arr) => {
  if (arr[0] === undefined) return 0;
  return strLength(arr.slice(0, -1)) + 1;
};

let str = "abcde";
let len = strLength(str);
console.log(len);
const factorial = (num) => {
  if (num === 1 || num === 0) return 1;
  return num * factorial(num - 1);
};

console.log(factorial(5));

재귀의 위력을 느낄 수 있는 문제

재귀를 쉽게 사용할 수 있는 방법


하노이탑

// 원반의 갯수, 시작 기둥(from), 이동할 기둥(to), 임시로 사용할 수 있는 기동(temp)
const hanoi = (count, from, to, temp) => {
  if (count === 0) return;
  hanoi(count - 1, from, temp, to);
  console.log(`원반 ${count}를 ${from}에서 ${to}로 이동`);
  hanoi(count - 1, temp, to, from);
};

hanoi(3, "A", "C", "B");

버블 정렬 (Bubble Sort)

핵심 개념

for문 두 개가 중첩됨

시간 복잡도

const bubbleSort = (arr) => {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = 0; j < arr.length - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        let temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
};

선택 정렬 (Selection Sort)

핵심 개념

성능

 

회고..

배운 내용 & 내 생각

  1. 재귀
    재귀는 단순히 "함수가 자기 자신을 호출하는 것"이라고만 알고 있었는데,
    이번에 콜스택과 메모리 구조를 이해하고 나니까 재귀 호출이 어떻게 돌아가는지 시각화가 됐다.
    특히 종료 조건(Base case)이 왜 중요한지 체감했다.
    종료 조건을 제대로 못 걸면 콜스택이 무한히 쌓이다가 스택 오버플로우가 발생한다는 걸 코드로 실험해보며 확인했다.

팩토리얼이나 피보나치 같이 작은 문제로 쪼개서 풀어가는 방식은 하향식(Top-down),
반복문이나 동적 계획법으로 밑에서부터 쌓아가는 건 상향식(Bottom-up)이라는 개념이 머릿속에 좀 더 명확해졌다.

  1. 정렬 알고리즘
    버블 정렬과 선택 정렬은 사실 비슷한 느낌인데, 다시 보면 비효율적인 방식이라는 걸 알게 됐다.
    특히 시간 복잡도 O(n²)를 등차수열의 합으로 직접 계산해보니 훨씬 더 와닿았다.
    그럼에도 불구하고 이런 정렬부터 배우는 이유는, 기초적인 반복과 비교 구조를 이해하기 위해서라는 생각이 들었다.

어려웠던 점과 해결 방법
재귀에서 하향식과 상향식 사고가 헷갈렸는데,
직접 코드를 그려보고 함수 호출 순서와 콜스택 흐름을 손으로 써보니까 감이 잡혔다.
또, 하노이탑 문제를 풀면서 "문제를 나누고, 나눈 문제를 어떻게 다시 합칠지"를 생각하는 패턴이 중요한 걸 느꼈다.

적용과 앞으로의 계획
재귀적인 사고를 백트래킹 문제에 적용해보고 싶다.
예를 들어 DFS 기반 조합, 순열, 경로 탐색 문제를 풀어보면서 패턴을 익힐 예정이다.
정렬 알고리즘은 이제 퀵 정렬, 병합 정렬 같은 효율적인 방식으로 넘어가야겠다.

또한, 재귀는 단순한 반복의 다른 표현이 아니라, 문제를 쪼개서 푸는 사고법이다.
이걸 익히면 알고리즘 문제에서 트리 구조나 백트래킹을 자연스럽게 생각할 수 있다.

답변 0