inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[인프런 워밍업 클럽 3기 - CS] - 3주차 발자국(자료구조와 알고리즘)

강동훈
1

💻 알고리즘

 

📌 삽입 정렬

- 정렬된 영역과 정렬되지 않은 영역을 나누어, 정렬되지 않은 영역의 첫 원소를 정렬된 원소와 비교하여 올바른 위치에 삽입

- 성능이 아쉬움(O(n^2))

📌 병합 정렬

분할 정복(divide and conquer): 해결하기 쉬울 정도로 문제를 쪼갠 후 하나씩 해결

- 재귀를 통해 정렬

- 배열을 더 이상 나눌 수 없을 때까지 쪼개고 병합하면서 정렬

- 시간 복잡도 (O(nlogn))

📌 퀵 정렬

- 분할 정복 알고리즘 중 하나

- 재귀를 사용

- 배열 중 하나를 '피봇(pivot)'으로 설정

- 배열의 시작: left / 끝: right index값 저장

- 값 비교 인덱스: leftStartIndex / rightStartIndex

- leftStartIndex > pivot && rightStartIndex < pivot 일 경우 멈춰서 값 교환

- 인덱스가 만나면 멈추고 피봇을 rightStartIndex랑 변경

- 재귀

- 시간 복잡도 (O(nlogn)) / 최악의 경우 (O(n^2))

- 병합 정렬보다 더 적은 메모리 사용으로 더 좋은 알고리즘이라고 판단

📌 동적 프로그래밍 - 메모이제이션

피보나치 수열- 이전 두 수를 무한하게 더하는 수

재귀 함수를 실행하면서 중복되는 부분이 무수히 발생한다.

- 계산 결과를 저장하고, 중복되는 계산은 저장된 값을 불러온다.

- 속도가 빠른 대신, 메모리 공간 차지가 많아진다.

function fibonacci(n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

function fibonacci2(n, memo) {
    if (n == 0 || n == 1) return n;

    if (memo[n] == null) {
        memo[n] = fibonacci2(n - 2, memo) + fibonacci2(n - 1, memo);
    }

    return memo[n];
}

console.time("first fibonacci");
console.log(fibonacci(40));
console.timeEnd("first fibonacci");

console.time("second fibonacci");
console.log(fibonacci2(40, {}));
console.timeEnd("second fibonacci");

//102334155
//first fibonacci: 867.412ms
//102334155
//second fibonacci: 0.073ms

 

📌 동적 프로그래밍 - 타뷸레이션

상향식 계산 방식으로 계산에 필요한 모든 값을 전부 계산 후 테이블에 저장

- 적은 메모리 사용 + 빠른 시간

- 해결하기 힘든 문제를 하향식으로 접근하여 메모리를 이용하여 빠르게 문제 풀이: 메모이제이션

- 직관적이지 못한 재귀, 상향식 접근이 필요: 타뷸레이션

 

📔 회고

🚀 최종 목표 : 로드맵을 마무리하고 알고리즘 문제들을 제대로 이해할 수 있을 정도의 수준이 되기.

🚀 매주 규칙:

  1. 각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분

  2. 강의를 듣고 최대한 이쁘게 (?) 정리해놓기

  3. 매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기

  4. 강의에 관련된 알고리즘 최소 1문제씩 풀어 습관화

     

  5. GPT를 통해 여러 문제를 리스트업하고 최적의 자료구조나 알고리즘을 맞춰보기

     

이번 인프런 워밍업 클럽을 진행하면서 커리큘럼에 맞춰 매일 강의를 듣고 지키려고 하였던 나의 목표 및 규칙이다.

규칙부터 살펴보자면,

  1. 각 섹션마다 하나의 .md 파일을 생성하고, 섹션 내 각 유닛은 헤더로 구분 : 10 / 10

  2. 강의를 듣고 최대한 이쁘게 (?) 정리해놓기 : 8 / 10

  3. 매 강의를 듣고 궁금하거나 이해가 안가는 부분은 추가적으로 더 찾아서 정리해두기: 6 / 10

  4. 강의에 관련된 알고리즘 최소 1문제씩 풀어 습관화

      : 9 / 10

  5. GPT를 통해 여러 문제를 리스트업하고 최적의 자료구조나 알고리즘을 맞춰보기 : 7 / 10

그래서 최종 목표

로드맵을 마무리하고 알고리즘 문제들을 제대로 이해할 수 있을 정도의 수준이 되기 : 6 / 10

알고리즘 문제를 풀거나, GPT를 통해 여러 문제에 대한 효율적인 자료구조를 대답해봐도 아직 내가 어느정도 성장했다고 느끼지는 못하였다. 자료구조와 알고리즘은 확실히 이론을 공부하는 것보다는 반복적인 연습과 실습이 중요하다라는 것을 다시 한 번 더 깨달은 것 같다. 알고리즘 공부 또한 꾸준히 해나갈 것이고 매일 최소 한 문제씩 풀어가면서 성장을 위해 필요한 최소의 연습양을 채우면서 점차 내가 원하는 수준의 알고리즘 문제 풀이 실력까지 높여가고 싶다.

알고리즘 · 자료구조 자료구조 알고리즘 인프런워밍업 감자

답변 0