꿈꾸는 개발자

코딩 테스트 공부 - 시간 복잡도 본문

코딩 테스트

코딩 테스트 공부 - 시간 복잡도

Anssony 2023. 12. 19. 16:35

 

 

C++ 기준에서 1억번의 연산 = 약 1초로 볼 수 있다.

 

코딩 테스트의 핵심 중 하나는 문제마다 주어진 시간 복잡도를 고려해 적절한 알고리즘을 선택하는 것

 

코딩 테스트에서는 빅-오 표기법($ O(n) $)을 기준으로 수행 시간을 계산하는 것이 좋다.

 

예를 들어보자.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int findNumber;
    int N = 1000000;
    srand(time(NULL));
    findNumber = rand() % 1000000;
    
    for (int i = 0; i < N; i++) {
        if (i == findNumber) {
            cout << i;
            break;
        }
    }
}

 

 

위 코드에서 시간 복잡도는 $ O(n) $ 이다. 이유는 for 문을 돌 때, N 만큼 반복하기 때문이다.

 

만약, for 문이 두 번 반복된다면 시간 복잡도는 어떻게 될까?

#include <iostream>
using namespace std;

int main()
{
    int N = 10000;
    int cnt = 1;
    
    for(int i = 0; i < N; i++)
        cout << "연산 횟수 : " << cnt++ << endl;

    for(int i = 0; i < N; i++)
        cout << "연산 횟수 : " << cnt++ << endl;
}

 

for 문이 두 번 반복되면 2N 만큼 반복적인 연산을 수행한다. 그러나, 시간 복잡도 기준으로는 $ O(n) $과 동일하다.

(2배가 되던 3배가 되던 $ O(n) $이 된다. 만약, N 번 이상 반복될 경우 그때의 시간 복잡도는 $ O(n) $이 아닌 $ O(n^{2}) $이 되기 때문이다.)

 

그럼 for 문이 중첩된다면?

#include <iostream>
using namespace std;

int main()
{
    int N = 10000;
    int cnt = 1;
    
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++)
            cout << "연산 횟수 : " << cnt++ << endl;
    }
}

 

위와 같이 for 문이 두 번 중첩된 경우 $ O(n^{2}) $ 이 된다.

 

가장 처음에서 말한 C++ 에서 1억 번의 연산이 1초라고 가정한다면, 알고리즘 문제의 시간 제한이 2초일 경우 2억 번의 연산만으로 해결해야하는 문제가 된다.

이를 통해 시간 복잡도를 적용하여 더 나은 알고리즘을 적용하는 것이 코딩 테스트의 핵심이라고 한다.

 

이를 통해 앞으로의 코딩 테스트 공부에서 생각해보고 사용할 수 있도록 적용할 예정이다.

 

참고한 영상

https://www.youtube.com/watch?v=v0ZF1cA0afA