[Algorithm] 신입 개발자 필수 알고리즘

개발자 기초 알고리즘

Posted by lim.Chuck on October 14, 2024

참조참조참조 https://github.com/zero-to-mastery/javascript-algorithms

자료 구조

자료 구조는 데이터를 특정 방식으로 구성하고 저장함으로써 더 효율적으로 접근하고 수정할 수 있게 해줍니다. 간단히 말해, 자료 구조는 데이터 값들, 데이터 간의 관계, 그리고 데이터를 다룰 수 있는 함수와 작업의 모임입니다.

B - 입문자, A - 숙련자

알고리즘

알고리즘은 어떤 종류의 문제를 풀 수 있는 정확한 방법이며, 일련의 작업을 정확하게 정의해 놓은 규칙들입니다.

B - 입문자, A - 숙련자

주제별 알고리즘

패러다임별 알고리즘

알고리즘의 패러다임은 어떤 종류의 알고리즘을 설계할 때 기초가 되는 일반적인 방법 혹은 접근법입니다. 알고리즘이 컴퓨터의 프로그램 보다 더 추상적인 것처럼 알고리즘의 패러다임은 어떤 알고리즘의 개념보다 추상적인 것입니다.

  • 브루트 포스(Brute Force) - 가능한 모든 경우를 탐색한 뒤 최적을 찾아내는 방식입니다.

  • 탐욕 알고리즘(Greedy) - 이후를 고려하지 않고 현재 시점에서 가장 최적인 선택을 하는 방식입니다.

  • 분할 정복법(Divide and Conquer) - 문제를 여러 작은 문제로 분할한 뒤 해결하는 방식입니다.

  • 동적 계획법(Dynamic Programming) - 이전에 찾은 결과를 이용하여 최종적으로 해결하는 방식입니다.

  • 백트래킹(Backtracking) - 모든 가능한 경우를 고려한다는 점에서 브루트 포스와 유사합니다. 하지만 다음 단계로 넘어갈때 마다 모든 조건을 만족했는지 확인하고 진행합니다. 만약 조건을 만족하지 못했다면 뒤로 돌아갑니다 (백트래킹). 그리고 다른 경로를 선택합니다. 보통 상태를 유지한 DFS 탐색을 많이 사용합니다.

  • 분기 한정법 - 백트래킹으로 찾은 각 단계의 최소 비용 해결법을 기억해 두고 있다가, 이 비용을 이용해서 더 낮은 최소 비용을 찾습니다. 기억해둔 최소 비용을 이용해 더 높은 비용이 드는 해결법은 더이상 탐색하지 않습니다. 보통 상태 정보를 사진 DFS 를 이용한 BFS 방식에서 사용됩니다.

유용한 정보

참고

▶ Data Structures and Algorithms on YouTube

Big O 표기

Big O 표기로 표시한 알고리즘의 증가 양상입니다.

Source: Big O Cheat Sheet.

아래는 가장 많이 사용되는 Big O 표기와 입력 데이터 크기에 따른 성능을 비교한 표입니다.

Big O 표기 10 개 일때 100 개 일때 1000 개 일때
O(1) 1 1 1
O(log N) 3 6 9
O(N) 10 100 1000
O(N log N) 30 600 9000
O(N^2) 100 10000 1000000
O(2^N) 1024 1.26e+29 1.07e+301
O(N!) 3628800 9.3e+157 4.02e+2567

자료 구조 작업별 복잡도

자료 구조 접근 검색 삽입 삭제 비고
배열 1 n n n  
스택 n n 1 1  
n n 1 1  
연결 리스트 n n 1 1  
해시 테이블 - n n n 완벽한 해시 함수의 경우 O(1)
이진 탐색 트리 n n n n 균형 트리의 경우 O(log(n))
B-트리 log(n) log(n) log(n) log(n)  
Red-Black 트리 log(n) log(n) log(n) log(n)  
AVL 트리 log(n) log(n) log(n) log(n)  
Bloom Filter - 1 1 - 거짓 양성이 탐색 중 발생 가능

정렬 알고리즘 복잡도

이름 최적 평균 최악 메모리 동일값 순서유지 비고
거품 정렬 n n2 n2 1 Yes  
삽입 정렬 n n2 n2 1 Yes  
선택 정렬 n2 n2 n2 1 No  
힙 정렬 n log(n) n log(n) n log(n) 1 No  
병합 정렬 n log(n) n log(n) n log(n) n Yes  
퀵 정렬 n log(n) n log(n) n2 log(n) No 퀵 정렬은 보통 제자리(in-place)로 O(log(n)) 스택공간으로 수행됩니다.
셸 정렬 n log(n) 간격 순서에 영향을 받습니다. n (log(n))2 1 No  
계수 정렬 n + r n + r n + r n + r Yes r - 배열내 가장 큰 수
기수 정렬 n * k n * k n * k n + k Yes k - 키값의 최대 길이