N * (1/2)^k = 1
N = 2^k
logN = log2^k
logN = klog2
logN = k
θ(logN)
입력값(N)이 증가해도 실행시간은 동일
시간 복잡도 → 기본 연산 수라고 생각
ex) stack의 push, popn = [0] if n[0] == 1: print(true) else: print(false)
연산이 한 번 실행될 때 마다 데이터의 크기가 절반 감소하는 알고리즘 (log의 지수는 항상 2)
ex) binary search 알고리즘, tree 형태 자료구조 탐색
입력값(N)이 증가함에 따라 실행시간도 선형적으로 증가
ex) 1중 for문for i in range(n): print(i)
O(N)의 알고리즘과 O(log N)의 알고리즘이 중첩된 형태
ex) 퀵 / 병합 / 힙 정렬
ex) 2중 For 문, 삽입/거품/선택 정렬
for i in range(n): for j in range(n): print(i+j)
빅오 표기법 중 가장 느린 시간 복잡도로 주로 재귀적으로 수행하는 알고리즘이 이에 해당
ex) fibonacci 수열def fibonacci(n,r): if n <= 0: return 0 else: if n == 1: return r[n] = 1 f(n-1, r) + f(n-2, r)
입력 데이터의 범위와 실행 시간 범위를 고려하면 문제에 대한 감을 잡을 수 있다. 보통 코드 1억 번 수행시간은 1초이다. 이를 기준으로 전체 수행시간을 어림잡아 문제에 사용되는 알고리즘에 대한 힌트를 얻으면 알고리즘 사용 가능 여부를 판단하여 접근할 수 있다.
위 근사치를 이용하면 간단하게 입력의 크기와 제한시간으로 정답 알고리즘의 복잡도를 대략적으로나마 예측해 볼 수 있습니다.
문제에서 가장 먼저 확인해야하는 내용은 시간제한(수행시간 요구사항)입니다.
시간제한이 1초인 문제를 만났을 때, 일반적인 기준은 다음과 같습니다.
거꾸로 이야기하면 입력이 100개 이하라면 대체로 어떤 알고리즘을 써도 풀릴 가능성이 높고, 입력이 매우 작은 경우는 완전탐색으로도 문제를 풀 수 있을 가능성이 높다는 이야기겠죠.

