.clear() :리스트 초기화
x in iterableObject (T/F) :iterable object 안에 x존재 진위 여부
함수 내에서 자기 자신을 다시 호출하는 것
스택내에 쌓아 두었다가 일괄로 처리
반복문으로 치환 가능 시간 복잡도에 따라서 사용하기 좋을경우도 있고 아닐 경우도 존재, 반복문 이 더 빠르지만 재귀를 사용하면 보기 더 쉽고 직관적임(유지 보수 좋음)
문제의 정의 부분 잘 알아야함(선언적 프로그래밍), 종료 조건 설정
선언적 프로그래밍 : 목표를 명시하고 알고리즘을 명시하지 않는것 알고리즘은 컴퓨터가 알아서 찾는다
함수에서 실행이 되어 결과물 까지 나오는 시간, 얼마나 빠르게 결과를 출력하는가
시간 복잡도에서 상수는 큰 의미가 없음 (n -> 무한대 경우 10000n < n^2 )
알고리즘의 수행 시간을 좌우하는 기준은 for loop 반복 횟수, 특정한 행이 수행되는 횟수,함수의 호출 횟수...
big-O표기법( O((g(n)) )
worst-case의 경우의 성능을 판단하여 평균과 가까운 성능으로 예측,
기껏해야 g(n)의 비율로 증가하는 함수 ,
f(n) = O((g(n)) : f는 g보다 크게 증가하지 않는다,
data(n)가 증가할수록 얼마나 코드가 느려지냐,
알 수 있는 한 최대한 tigth하게
복잡도가 nlogn + 5n = O(nlogn)인데 굳이 O(n^2)으로 쓸 필요없다.
#### 결론: 점근적 표기법은 성장률에 가장 중요한 부분을 제외하고 계수와 상수처럼 중요하지 않은부분 제외시키는 것
int addUp(int n){
int sum =0;
for(int i = 0; i<=n ; i++){
sum += i;
}
return sum;
int addUp(int n){
int sum = n *(n+1) / 2;
return sum;
}
def logarithmic_function(n):
result = 1
while result < n:
result *= 2
return result
n = 16
result = logarithmic_function(n)
print(f"The result is {result}")
O(nlogn): 대표적으로 병합 정렬 배열을 반으로 나누고 각각 정렬하기에 nlogn
O(n^2) : 2차원 배열
c
#include <stdio.h>
int main(){
for(i=0;i<n;i++){
for(j=0;i<n;j++)
}
} #시간 복잡도 n^2