학교에서 자료구조 수업을 들은 기억이 있다.
알고리즘에서 쓰이는 개념들을 어느정도 배웠었지만, 코딩테스트 준비는 심심할때마다 하는 것이 좋을 듯 하여 문서화해서 공부해보려 한다.
시간복잡도와 공간복잡도
컴퓨터는 보통 1초에 3~5억개 정도의 연산을 처리할 수 있다고 한다.
물론 우리가 High Level Language로 개발을 하면 복잡한 연산도 하나로 생각할 수 있겠지만,
컴파일 된 이후 어셈블리 언어에서는 instruction이 몇개가 나오냐는 다를 수 있기 때문에 대충 그렇다고 생각만 하면 좋을 것 같다.
const func = (arr, n) => { let count = 0; for (let i = 0; i < n; i++) { if (!(arr[i] % 5)) { count++; } } return count; };
- count를 선언하고 0을 대입하는 과정에서 연산 1번
- i에 값이 대입되는 시점에 연산 1번
- 0부터 n-1 까지 n번에 걸쳐 i가 n보다 작은지 확인하고 i를 1 증가시키니 연산 3번
- 5로 나눈 나머지를 계산하고 0과 일치하는지 확인할 때 연산 2번
- 5의 배수라면 count를 증가시키니 연산 1번
- 마지막에 count를 반환할 때 연산 1번
⇒ 5n + 3번의 연산이 필요하다.
적당히 n번의 연산이 필요하다 라고 생각하면 된다.
시간복잡도 (Time Complexity)
입력의 크기와 문제를 해결하는데 걸리는 시간의 상관관계
빅오표기법 (Big-O Notation)
주어진 식을 값이 가장 큰 대표항만 남겨서 나타내는 방법
O(N): 5N + 3, 2N + 10logN, 10N O(N^2): N^2 + 2N + 4, 6N^2 + 20N + 10logN
공간복잡도 (Space Complexity)
입력의 크기와 문제를 해결하는데 필요한 공간의 상관관계
크기 N짜리 2차원 배열 ⇒ O(N^2)
배열이 필요 없음 ⇒ O(1)
![시간복잡도, 공간복잡도 - algorithm[0]](/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252Fd715e42f-5ece-4a62-9155-8ef2d8d7d58b%252F42307f78-7e4d-4ba5-a74f-5d3dc96cb192%252F%2525E1%252584%252589%2525E1%252585%2525B3%2525E1%252584%25258F%2525E1%252585%2525B3%2525E1%252584%252585%2525E1%252585%2525B5%2525E1%252586%2525AB%2525E1%252584%252589%2525E1%252585%2525A3%2525E1%252586%2525BA_2024-04-27_%2525E1%252584%25258B%2525E1%252585%2525A9%2525E1%252584%252592%2525E1%252585%2525AE_3.01.43.png%3Ftable%3Dblock%26id%3D89e81285-4d2e-46cf-824c-455a436f7139%26cache%3Dv2&w=3840&q=75)