시간 복잡도

2025. 1. 14. 02:50 · Algorithm/알고리즘 스터디


시간 복잡도 유형

  • 빅 오메가 : 최선일 때 (Best case)의 연산 횟수를 나타내는 표기법 : 1번
  • 빅 세타 : 보통일 때 (Average case)의 연산 횟수를 나타내는 표기법 : N/2번
  • 빅 오 : 최악일 때 (Worst case)의 연산 횟수를 나타내는 표기법 : N번

* N은 데이터의 갯수를 의미한다. 


시간 복잡도 예시

import random
findNumber = random.randrange(1, 101) # 1~100 사이의 랜덤 값 생성

for i in range(1, 101):
	if i == findNumber:
    	print(i)
        break

 

위 코드에서

- 랜덤 넘버가 1이라면 가장 빠른 시간 내에 넘버를 찾은 것이기 때문에 빅 오메가를 표기한다.

- 랜덤 넘버 1~100 사이의 숫자일 때 데이터 개수(N = 100)의 절반인 50이 평균적으로 나오기에 빅 세타 표기법을 표기한다. 

- 랜덤넘버가 100인 경우, 1~99까지 모든 과정을 거치고, 100이라는 숫자를 찾았기 때문에 빅 오로 표기한다.


코딩 테스트에서는 어떤 시간 복잡도 유형을 사용하는가?

- 빅 오 표기법으로 계산한다.

- 왜? 다양한 테스트 케이스에서도 시간복잡도가 최악일 때를 염두해서 합/불을 판단하기 때문이다.


시간 복잡도 실전 문제 예시

시간제한 2초로 조건을 만족해야 한다.

조건 : 4,000만 번 이하의 연산 횟수로 문제를 해결해야 한다.

 

파이썬 프로그램에서는 2,000만 번 ~ 1억 번의 연산을 1초의 수행 시간으로 예측한다. 

 

연산 횟수는 1초에 2,000만 번 연산하는 것을 기준으로 생각한다면 2초에 40,000,000(4,000만)이 된다.

 

연산 횟수 = 알고리즘 시간 복잡도 n값에 데이터의 최대 크기를 대입하여 도출한다고 할 때

알고리즘 적합성 평가
버블 정렬 = (1,000,000)² = 1,000,000,000,000 > 40,000,000(4,000만) ⇢ 부적합 알고리즘
병합 정렬 = 1,000,000 log₂(1,000,000) = 약 20,000,000 < 40,000,000(4,000만) ⇢ 적합 알고리즘

 

* 버블 정렬은 O(N²)

* 병합 정렬은 O(nlogn)


시간 복잡도를 바탕으로 코드 로직을 개선할 수 있다?

가장 먼저 코드의 시간 복잡도를 도출해야 한다. 

시간 복잡도 도출 기준
1. 상수는 시간 복잡도 계산에서 제외한다.
2. 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준이 된다.

 

# 예제 1 : 연산 횟수 = N

N = 100000
cnt = 1

for i in range(N):
  print("연산 횟수" + str(cnt))
  cnt += 1
# 예제 2 : 연산 횟수 = 3N

N = 100000
cnt = 1

for i in range(N):
  print("연산 횟수" + str(cnt))
  cnt += 1

for i in range(N):
  print("연산 횟수" + str(cnt))
  cnt += 1

for i in range(N):
  print("연산 횟수" + str(cnt))
  cnt += 1

 

예제 1과 예재 2의 연산 횟수는 3배의 차이가 된다. 

 

N과 3N은 코딩테스트에서 같은 복잡도를 의미하기 때문에 상수는 복잡도 계산에서 제외한다. 

상수는 큰 변화를 주지 않는다.

# 예제 3 : 연산 횟수 = N²

N = 100000
cnt = 1

for i in range(N):
  for j in range(N):
    print("연산 횟수" + str(cnt))
    cnt += 1

 

이 코드는 N^2 이기 떄문에 큰 복잡도를 요구된다. 그래서 중첩을 확인해야 한다.

 

이와 같이 내가 작성한 코드의 시간 복잡도를 도출할 수 있다면 실제 코딩 테스트에서 시간 초과가 발생했을 때 이 원리를 바탕으로 문제가 되는 코드 부분을 도출할 수 있고, 이 부분을 연산에 더욱 효율적인 구조로 수정하는 작업으로 문제를 해결할 수 있다. 

728x90

'Algorithm > 알고리즘 스터디' 카테고리의 다른 글

스택 Stack & 큐 Queue  (1) 2025.01.20
인터페이스 맵 MAP  (1) 2025.01.20
배열 Array 와 리스트 List  (1) 2025.01.20
디버깅  (0) 2025.01.20
셋 SET  (2) 2025.01.16
'Algorithm/알고리즘 스터디' 카테고리의 다른 글
  • 인터페이스 맵 MAP
  • 배열 Array 와 리스트 List
  • 디버깅
  • 셋 SET
따`ddah
따`ddah
    250x250
  • 따`ddah
    IT's ddah
    따`ddah
  • 관리    글쓰기
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Projects
        • Auto Post : SNS 자동 업로더
      • kmooc
        • 기계 학습 기반의 데이터 공학
      • Algorithm
        • [C] Do it! 자료구조와 함께 배우는 알고리..
        • 알고리즘 스터디
        • 코딩 테스트
      • Basic
        • 운영체제 OS
        • 컴퓨터구조
        • 소프트웨어공학 (UML)
      • DBMS
        • 데이터베이스 이론
        • MySQL
        • Oracle SQL
        • BigQuery
        • Yammer
      • Programming
        • Python
        • C
        • Java
        • React
        • JavaScript
        • R
      • 빅데이터
      • AI N
        • 멀티미디어응용
        • 머신러닝
        • 인공지능 N
      • 자격증
        • Azure DP-900
        • Azure AI-900
        • SQLD
        • CSTS
      • 대외활동 및 인턴
        • 인턴
        • LG Aimers
        • Outta
        • 빅데이터 분석 학회 BDA
        • 세계시민교육연구소 청년단 GYIA
      • Tool
        • Git
        • IDE
      • 도서
        • IT
      • 그 외
        • 단축키
        • ✞
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    python
    파이썬
    파이썬{}
    jsx
    취업준비
    리액트
    dbms
    AI역량검사
    자료형
    취업
    javascript
    importturtle
    print(f"")
    티스토리챌린지
    파이썬 챗봇 만들기
    Oracle
    자바스크립트
    sql
    js
    react
    Py
    대외활동
    이름나이
    BDA학회
    주석
    input
    빅데이터분석
    오블완
    대학생학회
    오라클SQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
따`ddah
시간 복잡도
상단으로

티스토리툴바