본문 바로가기

ETC/자료구조 , 알고리즘

시간복잡도

이 글은 공부한 내용을 기반으로 정리하는 글이오니 건전한 비판은 환영합니다.

 

시간 복잡도는 왜 알아야 할까?

같은 프로그램을 작성하였을 때 A라는 사람과 B라는 사람이 하나의 목표를 두고 작성을 하였다.

A라는 사람의 프로그램을 실행하였을 때 3초가 걸리고, B라는 사람의 프로그램을 작성을 하였을 때 시간이 10초가 걸린다면 A라는 사람의 프로그램이 빠르기 때문에 1차원 적으로는 A의 시간이 더 빠르다.

시간 복잡도를 아는 방법은 먼저 프로그램을 돌리고 시간을 측정하였을 때, A-Z까지 시간으로 순서를 나누었을 때 일렬적으로 나눠질 수 있다. 즉 같은 입력을 제공하였을 때 어느 프로그램이 가장 빠를 수 있나 측정하는 것이 시간 복잡도이다.

 

빅 오 표기법

빅오 표기법이란? 시간에 가장 큰 영향을 주는 시간을 계산하는 것이다.

무슨 이야기냐면

int main(){
	int a,b;
    int c;
    scanf("%d %d",&a, &b);
    
    c = a+b;
    
    printf("%d",c);


	return 0;
}

위에서 로직을 보면 총 6번 줄의 코드를 작성하여 마지막에 c가 출력이 된다.

그러면 O(6) 즉 6번을 실행한다고 이야기 하지만, 여기서는 그렇게 큰 로직 덩어리는 없기 때문에 O(1)이라고 이야기 할 수 있다.

 

만약에 O(n+2)라고 하였을 때, 시간 복잡도는 어떻게 될까? 앞에 나온것을 기준으로 O(n)으로 이야기 할 수 있다.

왜냐하면, n자리에 100개, 1000개, 10000개가 들어올 수 있으므로 중요한 것은 n이 결정적인 시간에 영향을 주기 때문에 O(n)으로 이야기 할 수 있다.

 

int main(){
	int n;
	int sum;
	scanf("%d ",&n);
    

    for(int i = 0 ; i<n ; i++){
    	for(int j = 0 ; j<n ; j++){
        	sum += i+j;
        
        }
    }



	return 0;
}

위와 같이 sum을 구하기 위해 이중 for문을 작성 하였다. 이것은 어떻게 표현될 수 있을까? 

O(n2)로 표현할 수 있다.

만약에 이런 방식이면?

int main(){
	int n;
	int sum;
	scanf("%d ",&n);
    

    for(int i = 0 ; i<n ; i++){
    	for(int j = i ; j<n ; j++){
        	sum += i+j;
        
        }
    }



	return 0;
}

j가 i에 따라서 유동적으로 바뀌지만 1+.......+n 까지기 때문에 결과적으로 O(n2+n/2)로 나타나지만 O(n2)로 표현할 수 있다.

가장 중요한 것은 n이 시간 복잡도에 가장 큰 영향을 준 것이기 때문이다.

 

그래서 언제 사용할 것인가?

많은 경우의 수가 있겠지만, 여기서 설명하고자 하는 것은 알고리즘 문제를 풀 때 설명하는 것 입니다.

여기서 의문점이 드는 것은 과연 시간복잡도를 계산 한다고 해서 다 시간이 맞을까?입니다

답은 "아니다" 입니다. 왜냐하면 시간복잡도를 계산하는 것은 대략적인 시간을 계산하는 것이기 때문입니다.

그래도 왜 계산을 해야하냐면? 최악의 경우를 계산을 해봐야 하기 때문입니다.

그게 무슨이야기 냐면

int main(){
	int n;

	scanf("%d ",&n);
    

    for(int i = 0 ; i<n ; i++){
    	if(i*i>n){
        	break;
        }
    }



	return 0;
}

이 경우에는 n이 입력을 얼마 받나가 가장 중요합니다. 그렇기 때문에 계산을 해봐야 합니다.

'ETC > 자료구조 , 알고리즘' 카테고리의 다른 글

에라토스테네스의 체, 소인수 분해  (0) 2023.09.05
재귀함수  (0) 2022.08.09
프로세스와 쓰레드  (0) 2022.06.20
기본정렬  (0) 2022.05.18
완전탐색  (0) 2022.02.07