기록방

시간 복잡도 본문

CS/알고리즘

시간 복잡도

Soom_1n 2023. 6. 15. 20:48
💡 알고리즘에서 시간 복잡도
- 알고리즘 선택의 기준이 되는 시간 복잡도

- 코딩 테스트의 핵심 중 하나는 시간 복잡도를 고려해 적절한 알고리즘을 선택하는 것
- 주어진 문제를 해결하기 위한 연산 횟수 (일반적으로 1억번 연산을 1초로 간주해서 예측)

 

🚀 시간 복잡도 유형

  • 빅-오메가(Ω(n)) : 최선일 때(best case)의 연산 횟수를 나타낸 표기법
  • 빅-세타(Θ(n)) : 보통일 때(average case)의 연산 횟수를 나타낸 표기법
  • 빅-오(O(n)) : 최악일 때(worst case)의 연산 횟수를 나타낸 표기법
    ⇒ 코딩 테스트에서는 빅-오 표기법을 기준으로 수행 시간을 계산 (최악을 염두)

 

🚀 시간 복잡도 활용 예시

N 개의 수를 오름차순 정렬한다 (1 <= N 1<= 1,000,000)
제한시간 2초
  • 2초는 약 2억번 이하의 연산 횟수로 해결해야 함
  • 연산 횟수 = 알고리즘의 시간 복잡도 X 데이터의 크기
  • 버블 정렬을 사용한다면?
    • 버블 정렬의 시간 복잡도 : O(n^2)
    • 1,000,000 ^ 2 = 1,000,000,000,000 > 200,000,000 => 부적합 알고리즘
  • 병합 정렬을 사용한다면?
    • 병합 정렬의 시간 복잡도 : O(nlogn) 
    • 1,000,000 log 1,000,000 = 약 20,000,000 < 200,000,000 => 적합한 알고리즘

 

🚀 시간 복잡도 검출 기준

시간 복잡도 바탕의 코드 로직 개선
  1. 상수는 시간 복잡도 계산에서 제외
  2. 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준
    • 입력이 N일때 for문을로 0~N 반복
      • for문 1개 : 연산 횟수 N => O(N)
      • for문이 3개 : 연산 횟수 3N ⇒ O(N)
        • 상수를 무시하므로 시간 복잡도가 같다
      • for문 2개를 중첩 : 연산 횟수 N$^2$ ⇒ O(N$^2$)
        • 일반 for문이 더 있다더라도 시간 복잡도는 가장 많이 중첩 된 for문이 기준이다

 

🚀 정리

작성한 코드에 시간복잡도를 도출할 수 있다면, 실제 코딩 테스트에서 시간 초과가 발생했을 때 문제가 되는 부분을 도출 할 수 있고, 연산에 더욱 효율적인 구조로 수정하는 작업으로 문제를 해결할 수 있다.
  • 코딩 테스트에서 알고리즘을 한 번 잘못 선택 후 변경하면 시간이 부족해지는 경우가 많았다. 따라서 시간복잡도 계산 후 적합한 알고리즘 선택은 필수!
  • 기업 코딩 테스트에서는 제출 시간이나 맞은 테스트 케이스 수를 제외하면, 효율성과 연관된 '처리 시간'으로 점수를 주기도 하는 듯하다.
  • 알고리즘 별 시간 복잡도를 잘 알아두자.

 

참고 : Do It! 알고리즘 코딩 테스트 자바편

728x90

'CS > 알고리즘' 카테고리의 다른 글

투 포인터  (0) 2023.06.15
구간 합  (0) 2023.06.15
그리디(Greedy; 탐욕) 알고리즘  (0) 2023.02.17
Java 코딩 테스트 교재 #4  (0) 2022.09.29
Java 코딩 테스트 교재 #3  (0) 2022.09.21