정렬과 탐색의 기초

in #krsuccess6 days ago

정렬과 탐색, “찾아줘!”를 빠르게 만드는 법

이전 글에서 반복문으로 패턴을 찾는 감각을 잡았지? 이제는 그 패턴을 더 똑똑하게 써볼 차례야.
이번 4-4에서는 데이터 정렬하고, 그 다음에 필요한 값을 탐색(찾기)하는 기본 알고리즘을 배워볼게. 솔직히 말하면, “그냥 다 훑으면 되지”라고 생각할 수도 있는데… 데이터가 커지면 그게 은근히 멘붕이 오거든. 나도 예전에 “아, 어차피 금방 찾겠지” 했다가 로그 찍어놓고 멍 때린 적 있어 😂

highnesser


1) 정렬이 뭐길래 이렇게 중요해?

정렬은 말 그대로 데이터를 순서대로 줄 세우는 것이야.

예를 들면 이런 리스트가 있다고 해볼게.

  • [7, 3, 9, 1]

이걸 정렬하면 보통은:

  • 오름차순: [1, 3, 7, 9]
  • 내림차순: [9, 7, 3, 1]

왜 중요하냐면, 정렬을 해두면 탐색이 훨씬 쉬워지거든.
“정렬 전”엔 그냥 앞부터 다 봐야 하지만, “정렬 후”엔 어느 쪽을 봐야 하는지 판단할 수 있어.

sadeghshafiee91


2) 선형 탐색: 그냥 한 칸씩 훑는 방법

탐색은 “찾기”야. 정렬을 안 해도 할 수 있는 가장 기본은 선형 탐색(Linear Search)이야.

  • 배열 앞에서부터 하나씩 확인
  • 내가 찾는 값이면 끝
  • 아니면 계속

예시로 target = 3을 찾아보자.

def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i  # 찾은 인덱스 반환
    return -1  # 없으면 -1

arr = [7, 3, 9, 1]
print(linear_search(arr, 3))  # 1

아! 여기서 중요한 느낌만 잡자.
선형 탐색은 데이터가 작을 땐 그냥저냥 잘 돼. 근데 데이터가 엄청 커지면… 음… 나름 상상 가능한 그 속도 저하가 와.
“솔직히 말하면” 이런 방식은 정렬/최적화가 필요 없을 때 쓰는 편이야.

kasjanf


3) 정렬하면 탐색이 달라진다: 이진 탐색의 감각

이제 진짜 재미 포인트.
정렬된 배열에서 찾을 때는 이진 탐색(Binary Search)이 핵심이야.

아이디어는 이거:

  1. 가운데 값을 본다
  2. 찾는 값이 가운데보다 작으면 왼쪽만
  3. 찾는 값이 가운데보다 크면 오른쪽만
  4. 범위를 계속 줄여나간다

처음엔 좀 “어? 이게 진짜 빨라?” 싶을 수 있어. 나도 처음 배울 때 “반으로 나누는 거면 무슨 마법이지?” 했거든. 근데 사실은 되게 논리적이야.

Ogutier

이진 탐색 예시 코드

def binary_search(arr, target):
    left = 0
    right = len(arr) - 1

    while left <= right:
        mid = (left + right) // 2

        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1   # 오른쪽 반만 보기
        else:
            right = mid - 1  # 왼쪽 반만 보기

    return -1

arr = [1, 3, 7, 9]  # 정렬된 상태!
print(binary_search(arr, 3))  # 1

중요한 조건 1개!
이진 탐색은 정렬된 배열에서만 제대로 동작해.
정렬 안 돼 있으면 그냥… “반을 잘라서 운 맞추기”가 돼버려. 내가 예전에 이거 실수해서 결과가 자꾸 이상하게 나왔는데, 알고 보니 배열이 정렬이 안 돼 있더라. 아… 그때 한숨 한 번 크게 쉬었지 😂


4) 정렬 + 탐색 조합, 언제 쓰면 좋을까?

여기서 현실적인 감각만 잡고 갈게.

  • 정렬 자체도 시간이 걸려
  • 하지만 정렬해두면, 탐색을 여러 번 할 때 이득이 커져

예를 들어 이런 상황이면 나름 합리적이야:

  • 같은 데이터에서 값을 여러 번 찾아야 함
  • 또는 “찾을 거”를 찾는 로직이 반복적으로 수행됨

반대로, 데이터가 너무 적거나 딱 한 번만 찾는다면
정렬까지 하기보다 선형 탐색이 그냥 더 편할 때도 있어.

사실 이건 “정답”이 하나라기보다 상황 따라 달라.
근데 지금은 기초니까, 흐름만 이렇게 기억하면 돼:

  • 정렬: 데이터를 보기 좋게 줄 세우기
  • 선형 탐색: 한 칸씩 훑기
  • 이진 탐색: 정렬돼 있으면 반으로 쪼개서 빨리 찾기

5) 직접 손으로 그려보기(진짜 도움됨)

코딩도 좋지만, 정렬/탐색은 “그림”이 진짜 잘 먹혀.
예를 들어 정렬된 배열에서 이진 탐색이 어떻게 범위를 줄이는지 머릿속으로 한번만 해봐.

예: 배열 [1, 3, 7, 9]에서 target=9

  • 가운데(mid)는 7 → 9는 오른쪽
  • 오른쪽에서 가운데(mid)는 9 → 찾음!

이런 식으로 범위를 줄이는 게 핵심이야.

Sunriseforever


6) 오늘의 미니 체크

오늘 배운 걸 한 줄로 정리하면 이거야:

  • 정렬하면
  • 탐색이 쉬워지고
  • 특히 이진 탐색은 빠르게 “반으로 줄여가며” 찾는다

다음 글(4-5)에서는 이걸 이용해서 알고리즘 미니 프로젝트를 같이 만들어볼 거야.
“정렬하고, 찾아보고, 결과를 확인하는” 작은 작업을 통해 감각을 완전히 굳혀보자!

다음 편에서 만나요 👋