이진 탐색과 요소 제거 알고리즘 실습

기초 개념

  • 자료구조: 배열
  • 알고리즘: 이진 탐색, 양방향 포인터(투포인터)

주요 오류 피하기 팁

  • 변수의 활용을 최대한 활용하고, 목적에 맞게 명확하게 정의하세요.
  • 조건 비교 연산자(==, !=)의 논리는 항상 명확히 처리하세요.
  • 배열 인덱스 접근 시 범위를 초과하지 않도록 주의하세요. 특히 반복문의 종료 조건을 신중히 설정해야 합니다.

704. 이진 탐색 (Binary Search)

문제 링크 | 해설 | 동영상 강의

접근 전략

  • 왼쪽 경계(left)와 오른쪽 경계(right)를 초기화합니다.
  • 반복문 내에서 중간 위치(mid)를 계산하고, 목표 값과 비교합니다.
  • 목표 값이 중간 값보다 작으면 왼쪽 반만 검사 → right = mid - 1.
  • 목표 값이 중간 값보다 크면 오른쪽 반만 검사 → left = mid + 1.
  • 값이 일치하면 해당 인덱스(mid)를 반환합니다.
  • 반복 종료 후도 찾지 못했으면 -1을 반환합니다.

코드 구현

public class BinarySearchExample {
    public static void main(String[] args) {
        int[] numbers = {-1, 0, 3, 5, 9, 12};
        int targetValue = 9;
        int resultIndex = findPosition(numbers, targetValue);
        System.out.println("결과 인덱스: " + resultIndex);
    }

    public static int findPosition(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int middle = (left + right) / 2;
            if (target < arr[middle]) {
                right = middle - 1;
            } else if (target > arr[middle]) {
                left = middle + 1;
            } else {
                return middle;
            }
        }
        return -1;
    }
}

27. 요소 제거 (Remove Element)

문제 링크 | 해설 | 동영상 강의

핵심 아이디어

  • 두 개의 포인터를 사용합니다:
    • fastPointer: 전체 배열을 순회하며 값이 제거 대상이 아닌 항목을 찾아냅니다.
    • slowPointer: 새로운 배열의 위치를 추적하며, 유효한 값을 저장합니다.
  • 각 단계에서 fastPointer가 가리키는 값이 삭제 대상과 다르면, 그 값을 slowPointer 위치에 복사하고, slowPointer를 한 칸 증가시킵니다.
  • 최종적으로 slowPointer의 값은 새 배열의 길이입니다.

코드 예시

public class ElementRemover {
    public static void main(String[] args) {
        int[] data = {3, 2, 2, 3};
        int removeValue = 3;
        int newSize = removeTarget(data, removeValue);
        System.out.println("새로운 길이: " + newSize);
    }

    public static int removeTarget(int[] array, int value) {
        int writeIndex = 0;

        for (int readIndex = 0; readIndex < array.length; readIndex++) {
            if (array[readIndex] != value) {
                array[writeIndex] = array[readIndex];
                writeIndex++;
            }
        }

        return writeIndex;
    }
}

태그: 이진탐색 투포인터 배열 자바 알고리즘

9월 25일 00:48에 게시됨