: IT 분야에서는 " 문제를 해결하기 위한 프로세스 및 로직을 의미 "로 해석되며, 추가적으로 그저 단순히 "해결"이 아닌, "효율성, 정확성"등을 만족하는 최적의 로직을 의미
==> 알고리즘은 정확성, 효율성, 명확성을 확보하기 위해 사용함
: '입력값의 변화에 따라 연산을 실행할 때, 연산 횟수에 비해 시간이 얼마만큼 걸리는가?'에 대한 해답을 얻기 위해 입력값과 연산 수행 시간의 일련의 상관관계를 표현하는 방법
: 시간 복잡도를 표현하는 방법중 가장 일반적으로 가장되는 방법으로, 최악의 경우를 고려하여 산정하여 시간을 산정하는 방식, 이를 통해 '이 정도 시간까지 걸릴 수 있다'를 고려해 최악의 경우까지 대응가능하게 설계할 수 있음
[Bing-O 종류]
function O_1_algorithm(arr, index) {
return arr[index];
}
let result = O_1_algorithm([1,2,3,4,5], 3);
function O_n_algorithm(n) {
for (let i = 0; i < n; i++) {
// do something for 1 second
}
}
const binarySearch = function (arr, target) {
let start = 0, end = arr.length - 1
let mid = 0
while (start <= end) {
mid = parseInt((end + start) / 2)
if (arr[mid] === target) {return mid}
if (arr[mid] < target) { // 타겟이 오른쪽에
start = mid +1
} else { // 타겟 왼쪽
end = mid - 1
}
}
return -1
};
function O_quadratic_algorithm(n) {
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
// do something for 1 second
}
}
}
function fibonacci(n) {
if (n <= 1) {
return 1;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
: 알고리즘이 동작하는데 사용하는 메로리의 총량, 프로그램 수행시 가변적으로 변동되는 메모를 효율적으로 사용하면 프로그램 성능 개선 가능 (Big-O를 사용해 표현 가능)
[공간 복잡도 중요 상황]
: 선택의 순간마다 현재의 상황에서의 최대-최적의 이익을 얻기위해 선택하는 방식
[절차]
[특징]
: 모든 경우를 탐색에 문제를 해결하는 방법으로, 답을 무조건적으로 도출할 수 있다는 강력함이 있지만, 최악의 경우에 대한 시간 복잡도(Big-O)를 좋게 가지기 어려움
:시뮬레이션은 모든 과정과 조건이 제시되어, 그 과정을 거친 결과가 무엇인지 확인하는 유형
: 주어진 문제를 여러 개의 (작은) 하위 문제로 나누어 풀고, 하위 문제들의 해결 방법을 결합하여 최종 문제를 해결하는 방식
[tiling 예시]--> 한번씩 보면서 생각해 보자
function tiling2x1(n) {
//2*n 공간
let memo = [0, 1, 2]; // 타일 1개 세로로, 타일 2개 가로로 나열 & 세로로 내열
// memo를 정의하는 아이디어가 중요한 듯
for (let i = 3; i <= n; i++) {
memo[i] = memo[i - 1] + memo[i - 2]; // n>=3 부터는
}
return memo[n];
};
: 서로 다른 n개의 원소 중 r개를 순서와 상관있게 선택 혹은 나열하는 것
: 서로 다른 n개의 원소 중 중복 없이 순서에 상관없게 r개를 선택하는 것
: 최대 공약수를 구할려는 두수 사이에서 몫과 나머지 구하고 나누는 수와 나머지를 다시 나누는 과정을 반복하고 나머지가 0 이 되는 순간의 나누는 수가 최대 공약수가 되는 최대 공약수를 구하는 방법 (아래 예시 참고)
ex)
124 / 12 = 10 + 4
12/4 = 3 + 0
==> 4
: 어떤 집합이 있을 때, 이 집합의 모든 부분집합