알고리즘에 대해 매일 풀어보는 알고리즘 코드카타를 시작했습니다.
한시간 안에 최대한 풀어보는 것이지만 생각보다 재밌어서 계속 하고 싶어집니다.
알고리즘을 많이 공부하다 보면 저만의 풀이 방법도 있고 다른 사람들이 더 효율적으로 만든 방법들도 있어서
구경하는 재미가 많은 것 같습니다. 신기한 방법들을 많이 찾아보면서 익숙해지도록 하겠습니다.
알고리즘 ( Algorithm )
문제를 해결하기 위한 절차나 방법을 나타내는 단계적인 지침의 집합.
주어진 입력을 원하는 출력으로 변환하기 위한 명확한 단계를 제공.
컴퓨터 과학, 수학, 공학 등 다양한 분야에서 사용.
Big O 표기법
알고리즘의 시간 복잡도나 공간 복잡도를 나타내는 표기 방법 중 하나.
알고리즘의 실행 시간이나 사용되는 메모리 공간이 입력 크기에 어떻게 비례하는지를 표현하는 방법.
시간 복잡도 (Time Complexity)
알고리즘이 입력 크기에 따라 어떻게 실행 시간이 증가하는지를 나타내는 개념
시간 복잡도는 주어진 입력에 대해 알고리즘이 얼마나 빠르게 실행되는지를 나타내는 지표로 사용됨
빅 오 표기법(O(f(n)))을 사용하여 나타내며, 여기서 f(n)은 입력 크기 n에 대한 알고리즘의 실행 시간 함수
예시
루프 사용
def sum_array(arr): total = 0 for num in arr: total += num return total
루프가 n번 실행되므로 시간 복잡도는 O(n)
재귀 사용
def recursive_sum(arr, n): if n == 0: return 0 return arr[n-1] + recursive_sum(arr, n-1)
각 재귀 호출마다 하나의 요소를 더하고, 결국 n번 호출.
이 때문에 시간 복잡도도 O(n).
하지만 재귀의 경우 추가적인 함수 호출에 따른 오버헤드가 있을 수 있음.
공간 복잡도 (Space Complexity)
알고리즘이 실행되는 동안 필요로 하는 메모리 공간의 양을 나타내는 개념
주로 알고리즘의 실행 중에 생성되는 변수, 자료 구조, 임시 저장소 등을 고려하여
빅 오 표기법(O(f(n)))을 사용하여 나타냅니다. 여기서 f(n)은 입력 크기 n에 대한 알고리즘의 메모리 사용량
예시
재귀적으로 계산하는 팩토리얼 알고리즘
def factorial(n): if n == 0: return 1 return n * factorial(n - 1)
이 경우 공간 복잡도는 재귀 호출의 깊이에 따라 달라짐.
빅오 표기법 계산
상수 버리기
알고리즘의 시간 복잡도에서 가장 큰 영향을 주는 항목 중심
예를 들어, O(2n), O(3n^2)와 같은 경우 O(n), O(n^2)로 간소화
최고 차수 항목만 남기기
빅오 표기법에서는 가장 빠르게 증가하는 항목에 초점
예를 들어, O(n^2 + n)의 경우 O(n^2)로 간소화
다항식의 경우 최고 차수 항목만 고려
다항식의 경우 가장 빠르게 증가하는 항목에 초점
예를 들어, O(3n^3 + 5n^2 + 2n + 7)의 경우 O(n^3)로 간소화
연산자 상수 무시
빅오 표기법에서 연산자나 상수 값을 무시
예를 들어, O(3n^2 + 4n + 2)의 경우 O(n^2)로 간소화