Algorithm/개념 정리

시간 복잡도 (Time Complexity)

JunGi Jeong 2022. 11. 7. 10:03

시간복잡도(Time Complexity)

입력의 크기와 문제를 해결하는데 걸리는 시간의 상관관계

 

알고리즘 문제를 풀 때 단순히 '복잡도'라고 하면 보통 시간복잡도를 의미한다.

 

코딩 테스트에서의 '시간 제한'은

작성한 프로그램이 모든 입력을 받아 이를 처리하고 실행 결과를 출력하는 데까지 걸리는 시간을 의미

 

빅오표기법(Big-O Notation)

주어진 식을 값이 가장 큰 대표항만 남겨서 나타내는 방법

즉 함수의 상한만을 나타낸다.

 

O(N) : 5N + 3, 2N + 10lgN, 10N

O(N^2) : N^2 + 2N + 4, 6N^2 + 20N + 10lgN

O(NlgN) : NlgN + 30N + 10, 5NlgN + 6

O(1) : 5, 16, 36

 

예를 들어  N개의 데이터가 있을 때, 모든 데이터의 값을 더한 결과를 출력하는 프로그램을 만든다고 가정하자.

합계를 저장할 변수를 선언한 뒤, 모든 데이터를 하나씩 확인하며 그 값을 합계 변수에 더해주는 식으로 알고리즘을 작성할 수 있다.

 

package kr.co.dong;

public class Sum {
	public static void main(String[] args) {
		int[] array = {3, 5, 1, 2, 4};	
        int summary = 0;
        
        for(int idx = 0; idx < array.length; idx++) {
        	summary += array[idx];
        }
        
        System.out.println(summary); // .... 15
        
        // ... idx번 만큼 반복 이때 idx를 n이라 가정
        // O(N)번 만큼 반복 ... 시간복잡도는 O(N)
	}
}

 

package kr.co.dong;

public class Sum {
	public static void main(String[] args) {
		int a = 5;
        int b = 7;
        System.out.println(a + b);
        // ... 연산 횟수는 1이다.
        // 단순히 더하기 연산이 한 번 수행되기 때문
        // 이는 상수 연산이므로 시간복잡도는 O(1)로 표현가능
	}
}

 

package kr.co.dong;

public class Sum {
	public static void main(String[] args) {
		int[] array = {3, 5, 1, 2, 4};	
        int summary = 0;
        
        for(int idx = 0; idx < array.length; idx++) {
        	for(int sidx = 0; sidx < array.length; sidx++) {
            	int temp = array[idx] * array[sidx];
                System.out.println(temp);
            }
        }
        
        
        // ... idx번 만큼 반복 이때 idx를 n이라 가정, sidx를 n이라 가정
        // O(N^2)번 만큼 반복 ... 시간복잡도는 O(N^2)
	}
}