2월 06, 2024

Big O notation 과 시간 제한 (보통 1초 제한이라고 하면 어느정도?)

 우리가 흔히 Big O notation을 많이 사용한다. 

예를 들어 이중 for 문을 사용하면 시간 복잡도는 흔히 O(N^2) 이라고 하고, 단순 for 문을 사용하면 시간 복잡도는 흔히 O(N)이라고 한다. 그런데 알고리즘 문제들을 풀어보면 시간제한 1초 이런식으로 시간제한이 있는 경우가 많다.

 

그렇다는 말은 미리 문제를 풀기 전에 이 문제를 제한 시간 안에 끝낼 수 있을지 없을지를 알아야 한다는 것인데 Big O notation으로 시간복잡도를 구하더라도 이것을 초로 바꾸지 못한다면 아무 의미가 없다.

 

따라서 오늘은 보통 1초 제한이라고 하면 빅 오로 얼마 정도가 나와야 하는지에 대해서 알아보겠다.

결론부터 말하면 n으로 구성된 O( )를 계산했을 때의 값이 1억 정도면 1초 정도의 시간이 걸린다고 한다.

 

물론 이 값은 정확한 것이 아니고 문제와 알고리즘에 따라서 달라질 수 있는 것이지만 보통 자신의 알고리즘이 몇 초안에 끝날지를 계산하기 위해서는 1억 정도의 값이 1초라는 것을 알면 계산이 쉬워진다.

 

예를 들어 N의 최대값이 10만이라고 문제에서 주어진다면 

1. O(N) 의 시간복잡도일 경우에 값이 10만 정도이니, 1/1000초 정도가 걸릴 것이라고 예상할 수 있다.

2. O(N^2)의 시간복잡도의 경우에 값은 100억이므로, 100초 정도가 걸릴 것이라고 예상할 수 있다.

 

이처럼 만약 문제 제한이 1초라면 O(N^2)의 시간복잡도를 가지는 알고리즘으로 문제를 풀면 안되겠다라는 생각을 할 수 있다. 

 

1억정도면 1초가 걸린다는 것은 대략적인 추정치이고 실제는 이와 다를 수 있다

 

보통 1초가 걸릴 때 입력의 최대 크기를 살펴보면

  • O(N): 약 1억
  • O(N^2) : 약 1만
  • O(N^3) : 약 500
  • O(2^N) : 약 20
  • O(N!): 10

이라고 한다. 시간복잡도가 커질수록 입력의 최대 크기는 매우 작아지고,

이는 다시 말해서 만약 입력의 크기가 크지 않다면 O(N!) 과 같은 알고리즘을 사용해도 시간제한 안에 문제를 해결할 수도 있다는 말이다. 

 

문제에서 시간제한과 자신이 사용할 알고리즘을 미리 잘 구상하여 시간제한을 초과하는 경우를 방지하자.