본문 바로가기
Back-end & 알고리즘

코딩테스트 시간 초과 해결사: 효율적인 정렬 알고리즘과 이진 탐색 응용법

by CodeByJin 2026. 3. 1.
반응형

알고리즘의 기초를 지나 다익스트라나 DP까지 공부하셨다면 이제 문제는 '시간 제한'일 거예요. 사실 이 부분이 가장 번거로우시죠? 분명히 정답인 것 같은데 '시간 초과' 메시지가 뜨면 맥이 탁 풀리곤 합니다. 막상 인터넷을 찾아보면 빅오 표기법(Big-O)이니 뭐니 용어가 너무 어려워서 어디서부터 손을 대야 할지 감이 안 잡히실 텐데요.

저도 처음엔 무조건 이중 반복문만 돌리다가 낭패를 본 적이 많습니다. 하지만 2026년 현재 코딩테스트의 트렌드는 단순히 문제를 푸는 것을 넘어, '누가 더 효율적인 자원을 쓰느냐'에 집중하고 있어요. 오늘은 수천 개의 데이터 사이에서 빛의 속도로 답을 찾아내는 정렬과 이진 탐색(Binary Search)의 실전 압축 팁을 나누어 보려고 합니다.

정렬 알고리즘: 기본이지만 의외로 놓치는 선택 기준

우리가 흔히 쓰는 .sort() 함수 하나에도 수많은 원리가 숨어 있습니다. 대부분의 언어는 'Timsort'라는 하이브리드 방식을 채택하고 있죠. 하지만 코딩테스트에서는 상황에 따라 우리가 직접 정렬의 기준을 커스텀해야 하는 경우가 생각보다 많습니다.

  • 개요: 데이터를 특정한 순서(오름차순, 내림차순)로 나열하는 과정입니다. 이진 탐색을 하기 위한 필수 전제 조건이기도 하죠.
  • 조건: 데이터의 양(N)이 10만 개 이상이라면 반드시 $O(N \log N)$의 성능을 보장하는 정렬을 사용해야 합니다.
  • 활용 방법: 단순히 숫자 정렬을 넘어, '국어 점수는 내림차순, 영어 점수는 오름차순' 같은 다중 조건 정렬을 익혀두는 것이 실전에서 매우 유리합니다.

개인적으로 이 부분이 가장 핵심이라고 생각합니다. 많은 분이 퀵 정렬이 무조건 빠르다고 생각하시는데, 최악의 경우(이미 정렬된 데이터 등)에는 $O(N^2)$까지 성능이 떨어질 수 있어요. 그래서 요즘 기업들은 이런 예외 케이스를 일부러 집어넣기도 합니다. 솔직히 말씀드리면, 라이브러리를 쓰되 그 내부가 어떻게 돌아가는지는 꼭 알고 계셔야 뒤통수를 맞지 않습니다.

종류평균 복잡도최악 복잡도실전 활용 팁
선택/삽입 정렬O(N^2)O(N^2)데이터가 아주 적을 때만 쓰세요.
병합 정렬O(N \log N)O(N \log N)안정적인 성능이 필요할 때 좋습니다.
퀵 정렬O(N \log N)O(N^2)평균적으로 가장 빠르지만 조심해야 합니다.
계수 정렬O(N + K)O(N + K)데이터 범위가 작을 때 '치트키'입니다.

 
여러분은 정렬 기준이 3개 이상 섞인 문제를 만났을 때, 람다(lambda) 식을 바로 떠올리실 수 있나요? 아니면 튜플을 활용하시나요?

이진 탐색: 절반씩 뚝딱 버리는 탐색의 마법

이진 탐색은 마치 업앤다운(Up & Down) 게임과 같습니다. 1부터 100까지 숫자 중 하나를 맞출 때, "50보다 커?"라고 물어보는 순간 나머지 50개는 쳐다볼 필요도 없어지죠. 이게 바로 $O(\log N)$의 위력입니다.

  • 개요: 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 찾는 방식입니다.
  • 조건: 반드시 데이터가 정렬되어 있어야만 작동합니다. 정렬 안 하고 썼다가 틀리는 게 이 단계에서 흔히 하는 실수 중 하나죠.
  • 방법: 시작점(Start), 끝점(End), 중간점(Mid)을 설정하고, 찾는 값과 중간점 값을 비교하며 범위를 수정합니다.

이건 모르면 손해 보는 꿀팁인데, 이진 탐색은 단순히 특정 숫자를 찾는 용도로만 쓰이지 않습니다. '파라메트릭 서치(Parametric Search)'라고 해서, 최적화 문제를 결정 문제(Yes/No)로 바꿔 푸는 기법에 단골로 등장해요. 예를 들어 "나무를 최소한 이만큼 가져가기 위해 절단기 높이를 얼마로 설정해야 하는가?" 같은 문제 말이죠.

저도 처음엔 이 '범위 설정'이 너무 헷갈려서 while 문 조건에 <=를 넣을지 <를 넣을지 한참 고민하곤 했습니다. 제가 연구해본 결과, 가장 안전한 방법은 범위를 좁힐 때 mid + 1이나 mid - 1을 확실히 해주는 거예요. 어설프게 범위를 잡으면 무한 루프라는 늪에 빠지기 십상입니다.

실전 적용 시 주의사항 및 반전 포인트

하지만 이 좋은 방법들도 모든 상황에서 만능은 아닙니다. 때로는 공들여 구현한 이진 탐색이 오히려 효율을 깎아먹는 상황이 올 수도 있어요.

  • 데이터 업데이트가 빈번할 때: 데이터가 자꾸 추가되거나 삭제되는데 그때마다 매번 정렬을 새로 해야 한다면? 정렬 비용이 탐색 이득보다 커져서 배보다 배꼽이 더 커집니다.
  • 메모리 한계: 계수 정렬(Counting Sort) 같은 건 속도는 엄청나지만, 데이터 값의 범위가 너무 크면 메모리가 터져버릴 수 있어요.
  • 최신 기준 체크: 2026년 프로그래머스나 백준의 고난도 문제들은 단순히 알고리즘 하나만 묻지 않습니다. 반드시 문제의 '제한 사항'을 먼저 보고, N의 크기를 확인한 뒤 알고리즘을 선택하세요.

솔직히 말씀드리면, 실전에서는 정렬 라이브러리만 잘 써도 80%는 먹고 들어갑니다. 하지만 나머지 20%의 변별력은 "직접 정렬을 구현해야 하거나, 이진 탐색의 경계값을 미세하게 조정해야 하는 순간"에서 결정됩니다. 준비가 덜 된 상태에서 파라메트릭 서치를 만나면 당황해서 머릿속이 하얘질 수 있으니 주의가 필요해요.

실패 없는 코딩테스트 준비 전략

알고리즘 공부를 하다 보면 끝이 없다는 생각이 드실 거예요. 하지만 2025~2026년 대기업 채용 공고나 IT 커뮤니티의 후기를 종합해 보면, 결국 나오는 유형은 정해져 있습니다. 복잡한 문제를 만났을 때 당황하지 않으려면 나만의 '템플릿'을 만들어두는 것이 좋습니다.

  • 입력 데이터가 1,000만 개를 넘어가면 일단 이진 탐색부터 의심해보세요.
  • 정렬 기준이 복잡할 때는 Comparator나 key=lambda 사용법을 완벽히 숙달하세요.
  • 변동성이 큰 정보나 특정 언어의 내장 함수 성능은 반드시 해당 언어의 공식 홈페이지(예: Python Docs) 확인이 필요합니다.

한국정보과학회 자료에 따르면, 효율적인 탐색 알고리즘 활용 여부가 전체 코드 실행 시간의 70% 이상을 좌우한다고 합니다. 그만큼 기초가 튼튼해야 한다는 뜻이겠죠?

결국 코딩테스트는 누가 더 많이 아느냐가 아니라, 제한된 시간 안에 누가 더 '적절한 도구'를 꺼내 쓰느냐의 싸움인 것 같습니다. 정렬과 이진 탐색은 그 도구 가방에서 가장 먼저 꺼내야 할 기본 중의 기본이고요.

제 생각에는 무작정 어려운 문제를 풀기보다, 정렬된 배열에서 타겟을 찾는 코드를 아무것도 안 보고 1분 안에 짤 수 있을 정도로 반복하는 게 훨씬 유리해 보여요. 기초가 흔들리면 실전에서 경계값 하나 차이로 '오답' 판정을 받을 때 멘탈을 유지하기 힘들거든요. 오늘 정리해 드린 정렬의 기준과 이진 탐색의 범위를 머릿속에 꼭 저장해 두시길 바랍니다.

코딩테스트 합격의 마지막 관문, 다익스트라와 동적계획법(DP) 한 번에 끝내기

트리와 그래프 탐색을 어느 정도 익히고 나면 이제 다 됐겠지 싶다가도, 막상 실전 문제를 풀다 보면 '최단 경로'나 '점화식'이라는 벽에 부딪히곤 합니다. 사실 이 부분이 공부할 때 가장 번거로

byteandbit.tistory.com

반응형