일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- JPA
- 프로그래밍문제
- 백준
- 카프카
- Elasticsearch
- 월미도
- 클라우드
- 클라우드 컴퓨팅
- 스프링 부트
- 코드업
- springboot
- 알고리즘
- DFS
- 스프링
- gcp
- Kafka
- 오일러프로젝트
- Spring
- VPC
- aws
- Docker
- Spring Boot
- Apache Kafka
- 인천여행
- 로드밸런서
- 쿠버네티스
- 자료구조
- 스프링부트
- Spring Data JPA
- 백트래킹
- Today
- Total
GW LABS
시간 복잡도 빠르게 알아내기 본문
코딩 인터뷰 문제를 풀면서 테스트 케이스는 통과해도, 시간 초과로 통과하지 못해 좌절해본 경험이 있는가? 어떻게든 실행시간을 줄여보려고 코드를 튜닝하지만 제한된 시간의 압박과 초조함이 코드를 더 엉망으로 만든다. 코드를 쓰기 전에 내 알고리즘의 성능을 대략적으로 판단할 수 있다면 이런 불상사를 막을 수 있을 것이다. 이번 포스팅에서는 시간 복잡도를 빠르게 판단할 수 있는 방법을 정리한다. 순서대로 내 알고리즘에 적용해보자.
1. 반복문
가장 먼저 봐야할 부분은 반복문이다. 반복문이 몇 번 중첩되어 있는지부터 확인해보자. 중첩되어 있지 않은 반복문은 심플하게 N회를 순회하니까 O(N)이라고 판단할 수 있을 것이다. N번을 반복하는 반복문이 한 번 중첩되어 있다면 N * N회, O(N^2)이라고 판단할 수 있다. 반복문을 가장 먼저 확인하면서 시간 복잡도를 알아내자.
2. 주먹구구 법칙
반복문 기준으로 점근적인 시간복잡도를 얻어냈다면 밑의 법칙에 따라 판단해보자.
입력의 크기를 시간 복잡도에 대입해서 얻은 반복문 수행 횟수에 대해, 1초 당 반복문 수행 횟수가 1억을 넘어가면 시간제한을 초과할 가능성이 있다.
시간제한이 8초인 문제가 있고, N의 크기가 100,000이라고 가정하자. 현재 내 알고리즘의 시간복잡도가 O(N^2)이라고 가정하면 시간제한을 초과할 가능성이 있을까? 반복 회수는 (10^10 / 8) 이므로 알고리즘을 다시 설계해야 한다!
두 단계의 간단한 법칙만으로 내 알고리즘의 문제를 파악할 수 있다. 코드를 작성하기 전에 알고리즘 설계 단계에서 대략적인 내 코드의 성능을 파악할 수 있다면 코딩 인터뷰에서 코드 튜닝으로 인한 많은 시간 손실을 막을 수 있을 것이다. 코드를 작성하기 전에 알고리즘 설계를 먼저 하면서 문제를 접근하도록 하자!
Reference
알고리즘 문제 해결 전략 - 구종만
'Algorithm & DataStructure' 카테고리의 다른 글
[오일러 프로젝트 16] 2^1000의 자리수 구하기 (0) | 2020.06.05 |
---|---|
[코드업 4434] 좋은 수열 (0) | 2020.05.24 |
[코드업 3540] 0 만들기 게임 (0) | 2020.05.21 |
[코드업 3506] 블럭 채우기 1 (small) (0) | 2020.05.10 |
[백준 2231] 분해합 (0) | 2020.05.04 |