[Java / 알고리즘] 탐색 알고리즘. 순차 탐색(선형 탐색), 이진 탐색

2023. 11. 26. 19:28·CodingTest/Algorithm
탐색이란 여러 데이터 중에서 원하는 데이터를 찾아내는 것을 말한다.

 

 

1. 순차 탐색(Sequential Search), 선형 탐색(Linear Search)

순차 탐색 또는 선형 탐색이라고 한다.

데이터가 담겨있는 리스트를 앞에서부터 하나씩 비교해서 원하는 데이터를 찾는 방법이다.

 

 

 

[ 코드 ]

public class main {
    public static void main(String[] args) {
        int[] array = {23, 45, 12, 67, 89, 34, 56, 72};
        int target = 34;

        // 선형 탐색을 수행하고 결과를 출력
        int result = linearSearch(array, target);
        if (result == -1) {
            System.out.println("Element " + target + " not found in the array.");
        } else {
            System.out.println("Element " + target + " found at index " + result + ".");
        }
    }

    // 선형 탐색 구현
    static int linearSearch(int[] arr, int target) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == target) {
                return i; // 원소를 찾으면 인덱스 반환
            }
        }
        return -1; // 원소를 찾지 못한 경우 -1 반환
    }
}

 

 

시간 복잡도

최악의 경우 배열의 크기 n * n번 반복하므로 시간 복잡도는 O(n^2) 이다.

 

 

2.  이진 탐색(Binary Search)

  • 탐색할 자료를 둘로 나누어 해당 데이터가 있을만한 곳을 탐색하는 방법이다.
  • Divide - 리스트를 두 개의 서브 리스트로 나눈다.
  • Conquer
    • 검색할 숫자 (target) > 중간값 이면, 뒷 부분의 서브 리스트에서 검색할 숫자를 찾는다.
    • 검색할 숫자 (target) < 중간값 이면, 앞 부분의 서브 리스트에서 검색할 숫자를 찾는다.

 

 

 

[ 코드 ]

public static void main(String[] args)
{
    int[] sortedArray = {1, 2, 4, 7, 9, 12, 15, 18, 22, 27};
    int target = 15;

    // 이진 탐색을 수행하고 결과를 출력
    int result = binarySearch(sortedArray, target);
    if (result == -1) {
        System.out.println("Element " + target + " not found in the array.");
    } else {
        System.out.println("Element " + target + " found at index " + result + ".");
    }
}

// 이진 탐색 구현
static int binarySearch(int[] arr, int target) {
    int left = 0;
    int right = arr.length - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2;

        // 중간값이 타겟과 같으면 중간값의 인덱스를 반환
        if (arr[mid] == target) {
            return mid;
        }
        // 중간값이 타겟보다 작으면 오른쪽 반만 확인
        else if(arr[mid] < target) {
            left = mid + 1; // 중간값은 볼필요 없으므로 +1
        }
        // 중간값이 타겟보다 크면 왼쪽 반만 확인
        else {
            right = mid - 1;
        }
    }
    // 타겟을 찾지 못한 경우
    return -1;
}

 

 

시간 복잡도

N개의 리스트를 매번 2로 나누어 1이 될 때까지 비교연산을 k회 진행하므로 시간 복잡도는 O(logn) 이다

저작자표시 (새창열림)
'CodingTest/Algorithm' 카테고리의 다른 글
  • [Java] 스택(Stack)이랑 큐(Queue)가 뭔데? + 코딩테스트 문제
  • [Java / 알고리즘] 탐욕 알고리즘(그리드 알고리즘)
  • [Java / 알고리즘] 그래프 알고리즘 BFS와 DFS
  • [Java / 알고리즘] 대표적인 정렬 알고리즘. 버블 정렬, 삽입 정렬, 선택 정렬
마볼링
마볼링
개발과 게임에 관한 내용을 읽기 쉽게 정리합니다.
  • 마볼링
    게임을 좋아하는 개발자의 블로그
    마볼링
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Project
        • LOATODO
        • 인스타그램 클론코딩(중단)
      • Language
        • Java
        • PHP
        • Javascript
      • Framework & Library
        • Spring
        • Vue
      • Computer Science
        • Web
        • Linux
      • CodingTest
        • Algorithm
        • Kotlin으로 푼 코딩 테스트
        • Java로 푼 코딩 테스트
        • Sorting & Thinking
        • BFS
      • 책&강의 정리
      • 정보처리기사
      • 개인
        • 팰월드(PALWORLD)
        • 마인크래프트
  • 블로그 메뉴

    • 링크

      • GitHub
      • Threads
    • 공지사항

    • 인기 글

    • 태그

      error
      Spring
      코딩테스트
      프로그래머스
      jsp
      LoaTodo
      CS
      티스토리챌린지
      아크 서바이벌
      codingtest
      php
      네트워크
      로아투두
      이터널 모드
      springboot
      운영체제
      오블완
      JPA
      Database
      java
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.1
    마볼링
    [Java / 알고리즘] 탐색 알고리즘. 순차 탐색(선형 탐색), 이진 탐색
    상단으로

    티스토리툴바