✨ 데이터 구조란?
✨ 알고리즘 이란?
✨ 서로 다른 개념이면서 상호 보완적.
💡 데이터 : 컴퓨터에 저장되어 있거나 컴퓨터가 처리 중인 모든 것을 뜻한다.
📌 컴퓨터는 데이터를 입력받아 처리 및 가공하여 출력하는 장치이다. 올바른 데이터를 입력해도 무의미한 결과를 출력할 수 있다.
✨ 기본 자료형
✨ 기본 자료형의 종류
✨ 프로그래밍에서의 함수
✨ 수학에서의 함수
매개변수를 입력받아 처리한 값을 반환한다는 점에서 수학에서의 함수와 같다.
✨ 함수, 메서드, 프로시저, 서브루틴
프로그래밍에서의 함수는 매개변수(파라미터)라는 데이터를 입력으로 사용하며 때로는 결과를 반환하기도 하고, 아무 결과를 반환하지 않을 수 있다. 이를 void 함수라 한다.
메서드는 OOP 언어에서 클래스 내부에 있는 함수를 메서드라고 한다.
일부 프로그래밍 언어에서는 함수를 프로시저 또는 서브루틴이라고 한다.
모두 의미와 사용하는 목적이 같다. 단지 사용하는 프로그래밍 언어나 사람에 따라 용어의 선택이 달라질 뿐이다.
✨ 재귀 함수
📌 프로그래밍 언어에 많이 사용하는 방법. 실제 많은 알고리즘이 재귀적으로 동작.
✨ 반복
✨ 분할 정복 알고리즘(divide and conquer algorithm)
✨ 탐욕 알고리즘(greedy algorithm)
✨ 동적 프로그래밍(=동적 계획법) 알고리즘(dynamic programming algorithm)
✨ 탐욕 vs 동적 프로그래밍
- 둘 다 문제를 더 작은 단위로 나누어 해결
- 탐욕 알고리즘은 근사치를 구한다(바로 눈앞에 있는 것만 봄. 그래서 탐욕)
- 동적 프로그래밍은 최적화를 한다
✨ 알고리즘의 효율성
시간 복잡도(time complexity)와 공간 복잡도(space complexity)의 방법 이용
일반적으로 사용되는 방법은 시간복잡도이며 그 중 '빅 오 표기법'을 사용한다.
시간복잡도
주어진 입력에 따라 알고리즘이 문제를 해결할 때 걸리는 시간. 가장 일반적으로 사용하는 알고리즘 성능 효율 분석 방법.
공간복잡도
알고리즘이 문제를 해결할 때 점유하는 메모리 공간을 뜻함. 자원이 제한된 시스템에서 동작하는 프로그램을 구현하는 것과 같이 특별한 경우에 사용하는 분석 방법.
✨ 알고리즘의 효율성을 설명할 때 빅 오메가, 리틀 오메가, 빅 오, 리틀 오, 세타 등 다양한 표기법이 존재
✨ 참고
📌 빅 오 표기법은 알고리즘의 실행 시간이 최악인 경우를 나타내는 것이다.
O(1) : 상수형 알고리즘, 데이터 입력량과 무관하게 실행시간이 일정하다
O(n) : 선형 알고리즘, 데이터 입력량에 비례하여 실행 시간이 증가
O(logn) : 로그형 알고리즘, 데이터 입력량이 늘어날수록 단위 입력당 실행 시간이 줄어든다
O(n logn) : 선형-로그형 알고리즘, 데이터 입력량이 n배 늘면 실행 시간이 n배 조금 넘게 늘어남
O(n²) : 2차 알고리즘, 데이터 입력량의 제곱에 비례하여 실행 시간이 늘어 난다.
O(2ⁿ) : 지수형 알고리즘, 데이터 입력량이 추가될 때마다 실행 시간이 두배로 늘어난다
O(n!) : 팩토리얼형 알고리즘, 데이터 입력이 추가될 때마다 실행 시간이 n배로 늘어난다
걸리는 시간
O(1) < O(logn) < O(n) < O(n logn) < O(n²) < O(2ⁿ) < O(n!)
왼쪽에서 오른쪽으로 갈수록 느려지고 효율이 떨어 진다.