반응형
코딩 테스트를 풀다 보면 자주 마주치는 고민이 있다.
“이 코드, 시간 안에 돌아갈까?”
문제의 난이도는 종종 입력의 크기(N)와 제한 시간(보통 1~5초)에 따라 결정되는데,
이를 가늠할 줄 아는 능력은 실력의 기준선이 된다.
이번 글에서는 코딩 테스트에서 반드시 알고 있어야 할
시간 제한 기준과 시간 복잡도 판단법을 정리해본다.
🚦 시간 제한 1초 = 약 1억 번 연산 가능
코딩 테스트 환경은 보통 아래 기준으로 설계된다.
- 제한 시간: 1~5초
- 1초에 약 1억 번 연산 가능 (기준 CPU 성능 가정)
즉, 입력 크기 N이 주어졌을 때,
내가 짜려는 알고리즘이 몇 번 연산을 수행할지 미리 감을 잡아야 한다.
⏱️ 시간 복잡도별 연산 가능 횟수
시간 복잡도 | 1초 기준 연산량 | 설명 |
---|---|---|
O(N) | 약 1억 번 | 선형 탐색, 단순 순회 |
O(N²) | 약 10,000 번 | 이중 루프 |
O(N³) | 약 500 번 | 3중 루프 |
O(2^N) | 약 20 번 | 완전탐색, DFS 등 |
O(N!) | 약 10 번 | 순열/조합 전수 탐색 |
📌 N의 크기에 따른 전략
입력 크기 N
만 잘 봐도, 시간 복잡도를 예측할 수 있다.
N의 최대값 | 선택 가능한 시간 복잡도 |
---|---|
500 | O(N³) 이하 |
2,000 | O(N²) 이하 |
100,000 | O(N log N) 이하 |
10,000,000 | O(N) 이하 |
10,000,000,000 | O(log N) 이하 |
예: N이 100,000인데 내가 짜는 알고리즘이 O(N²)?
→ 100,000² = 100억 번 → 1초 안에 절대 안 돌아감!
⚙️ 실전에서 자주 만나는 시간 복잡도들
연산 또는 함수 | 시간 복잡도 | 설명 |
---|---|---|
for loop |
O(N) | 단순 순회 |
이중 for loop |
O(N²) | 완전 탐색 |
array.contains() |
O(N) | 배열 탐색 |
set.contains() |
O(1) | 해시 기반 탐색 |
dictionary[key] |
O(1) | 키-값 조회 |
sort() (Swift) |
O(N log N) | 퀵정렬 기반 |
binary search |
O(log N) | 정렬 배열 탐색 |
heap.pop() |
O(log N) | 우선순위 큐 |
queue.pop() / stack.pop() |
O(1) | 선형 자료구조 |
🔍 탐색은 Set 또는 Dictionary로 최적화하자
가장 자주 만나는 실수 중 하나는
array.contains(x)
를 여러 번 돌리는 것. 이건 매번 O(n)이기 때문에,
데이터가 많고 반복 탐색이 필요하다면 느릴 수밖에 없다.
해결 방법
배열을 처음에 한 번 Set
또는 Dictionary
로 변환하고,
이후 탐색은 O(1)로 빠르게 처리한다.
let arr = [1, 2, 3, 4, 5]
let set = Set(arr)
set.contains(3) // O(1)
시간 복잡도를 읽는 눈이 실력을 만든다
- 문제를 보면 먼저 N의 크기를 확인하자.
- 그다음 시간 복잡도를 예측해서, 어떤 방식이 살아남을지 판단한다.
- Set, Dictionary, 정렬, 이진 탐색, 힙 등
자료구조와 알고리즘 조합으로 성능을 끌어올리는 건 실전에서 큰 차이를 만든다.
🧠 “코드는 맞는데 시간 초과”라는 문장을 줄이고 싶다면?
이 글을 북마크하고 자주 복습하자.
📌 다음 글에서는 알고리즘별 시간 복잡도 계산법과 예제들을 더 정리해볼게요.
궁금한 주제가 있다면 댓글로 남겨줘요!
반응형
'모바일앱 > 알고리즘' 카테고리의 다른 글
기본적인 자료구조(4) - 큐 (Queue) (0) | 2024.10.01 |
---|---|
기본적인 자료구조(3) - 스택(Stack) (0) | 2024.10.01 |
기본적인 자료구조(2) - 연결 리스트(Linked List) (0) | 2024.10.01 |
기본적인 자료구조(1) - 배열(Array) (0) | 2024.09.29 |
백준 (단계별로 풀어보기) 입출력과 사칙연산(1) (0) | 2021.09.30 |