ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 배열 검색하기
    Java/Collection(컬렉션) 2024. 9. 17. 16:52
    반응형

    목차

       

      자바에서는 배열을 검색하는 다양한 방법이 있습니다. 이번 문서에서는 배열을 검색하는 여러 가지 방법에 대해 설명하겠습니다. 주요 메서드로는 순차 검색, 이진 검색, 라이브러리 메서드를 사용한 검색, 그리고 2차원 배열에서 값의 존재 여부를 확인하는 방법이 있습니다. 추가로 배열에서 최대 및 최소값을 찾는 방법도 설명하겠습니다.

       

      1. 순차 검색

      순차 검색을 사용하여 배열에서 특정 값을 찾는 방법입니다. 배열의 첫 번째 요소부터 시작하여 찾아야 하는 값을 순차적으로 비교합니다.

      /**
       * 순차 검색을 사용하여 배열에서 특정 값을 찾음
       *
       * @param array 검색할 배열
       * @param value 검색할 값
       * @return 배열에서 값의 인덱스 (존재하지 않으면 -1)
       */
      public int linearSearch(int[] array, int value) {
        for (int i = 0; i < array.length; i++) {
          if (array[i] == value) {
            return i;
          }
        }
        return -1;
      }

      단위 테스트

      @Order(1)
      @DisplayName("linearSearch: 선형 검색")
      @Test
      void testLinearSearch() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        int valueToSearch = 8;
      
        // when
        int actualIndex = arraySearch.linearSearch(array, valueToSearch);
      
        // then
        int expectedIndex = 2;
        assertEquals(expectedIndex, actualIndex);
      }

       

      2. 이진 검색

      이진 검색을 사용하여 정렬된 배열에서 특정 값을 찾는 방법입니다. 배열이 정렬되어 있어야 하며, 중간 요소와 비교하여 검색 범위를 줄여나갑니다.

      /**
       * 이진 검색을 사용하여 정렬된 배열에서 특정 값을 찾음
       *
       * @param array 정렬된 배열
       * @param value 검색할 값
       * @return 배열에서 값의 인덱스 (존재하지 않으면 -1)
       */
      public int binarySearch(int[] array, int value) {
      
        int left = 0;
        int right = array.length - 1;
      
        while (left <= right) {
          int middle = left + (right - left) / 2;
      
          if (array[middle] == value) {
            return middle;
          }
      
          if (array[middle] < value) {
            left = middle + 1;
          } else {
            right = middle - 1;
          }
        }
      
        return -1;
      }

      단위 테스트

      @Test
      @Order(2)
      @DisplayName("binarySearch: 이진 검색")
      void testBinarySearch() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        Arrays.sort(array);
      
        int valueToSearch = 8;
      
        // when
        int actualIndex = arraySearch.binarySearch(array, valueToSearch);
      
        // then
        int expectedIndex = 4;
        assertEquals(expectedIndex, actualIndex);
      }

       

      3. Arrays.binarySearch 메서드를 사용한 검색

      `Arrays.binarySearch` 메서드를 사용하여 정렬된 배열에서 빠르게 값을 찾는 방법입니다.

      /**
       * Arrays.binarySearch 메서드를 사용하여 정렬된 배열에서 특정 값을 찾음
       *
       * @param array 정렬된 배열
       * @param value 검색할 값
       * @return 배열에서 값의 인덱스 (존재하지 않으면 -1)
       */
      public int binarySearchUsingLibrary(int[] array, int value) {
        int index = Arrays.binarySearch(array, value);
        return index >= 0 ? index : -1;
      }

      단위 테스트

      @Order(3)
      @DisplayName("binarySearchUsingLibrary: Arrays.binarySearch 메서드를 사용한 이진 검색")
      @Test
      void testBinarySearchUsingLibrary() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        Arrays.sort(array);
      
        int valueToSearch = 8;
      
        // when
        int actualIndex = arraySearch.binarySearchUsingLibrary(array, valueToSearch);
      
        // then
        int expectedIndex = 4;
        assertEquals(expectedIndex, actualIndex);
      }

       

      4. 2차원 배열에서 특정 값의 존재 여부 확인

      2차원 배열에서 특정 값이 존재하는지 확인하는 방법입니다. 각 서브 배열을 순차적으로 검색합니다.

      /**
       * 2차원 배열에서 특정 값이 존재하는지 확인
       *
       * @param array 검색할 2차원 배열
       * @param value 검색할 값
       * @return 값이 존재하면 true, 그렇지 않으면 false
       */
      public boolean containsIn2DArray(int[][] array, int value) {
        for (int[] subArray : array) {
          if (Arrays.stream(subArray).anyMatch(i -> i == value)) {
            return true;
          }
        }
        return false;
      }

      단위 테스트

      @Order(4)
      @DisplayName("containsIn2DArray: 2차원 배열 내 값의 존재 여부 확인")
      @Test
      void testContainsIn2DArray() {
      
        // given
        int[][] array2D = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };
        int valueToSearch = 5;
      
        // when
        boolean result = arraySearch.containsIn2DArray(array2D, valueToSearch);
      
        // then
        assertTrue(result);
      }

       

      5. 배열에서 최대값 찾기

      배열에서 최대값을 찾는 방법입니다. 순차적으로 모든 요소를 비교하여 최대값을 찾습니다.

      /**
       * 배열에서 최대값을 찾음
       *
       * @param array 검색할 배열
       * @return 배열에서 최대값
       * @throws NoSuchElementException 배열이 비어있는 경우
       */
      public int findMaxUsingForLoop(int[] array) {
        if (array == null || array.length == 0) {
          throw new NoSuchElementException("Array is empty");
        }
      
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
          if (array[i] > max) {
            max = array[i];
          }
        }
        return max;
      }
      
      /**
       * 배열에서 최대값을 찾음
       *
       * @param array 검색할 배열
       * @return 배열에서 최대값
       * @throws NoSuchElementException 배열이 비어있는 경우
       */
      public int findMax(int[] array) {
        return Arrays.stream(array)
            .max()
            .orElseThrow(NoSuchElementException::new);
      }

      단위 테스트

      @Order(5)
      @DisplayName("findMaxUsingForLoop: for 루프를 사용하여 배열 최대값 찾기")
      @Test
      void testFindMaxUsingForLoop() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        int expectedMax = 8;
      
        // when
        int actualMax = arraySearch.findMaxUsingForLoop(array);
      
        // then
        assertEquals(expectedMax, actualMax);
      }
      
      @Order(6)
      @DisplayName("findMax: 스트림을 사용하여 배열 최대값 찾기")
      @Test
      void testFindMax() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        int expectedMax = 8;
      
        // when
        int actualMax = arraySearch.findMax(array);
      
        // then
        assertEquals(expectedMax, actualMax);
      }

       

      6. 배열에서 최소값 찾기

      배열에서 최소값을 찾는 방법입니다. 순차적으로 모든 요소를 비교하여 최소값을 찾습니다.

      /**
       * 배열에서 최소값을 찾음
       *
       * @param array 검색할 배열
       * @return 배열에서 최소값
       * @throws NoSuchElementException 배열이 비어있는 경우
       */
      public int findMinUsingForLoop(int[] array) {
        if (array == null || array.length == 0) {
          throw new NoSuchElementException("Array is empty");
        }
      
        int min = array[0];
        for (int i = 1; i < array.length; i++) {
          if (array[i] < min) {
            min = array[i];
          }
        }
        return min;
      }
      
      /**
       * 배열에서 최소값을 찾음
       *
       * @param array 검색할 배열
       * @return 배열에서 최소값
       * @throws NoSuchElementException 배열이 비어있는 경우
       */
      public int findMin(int[] array) {
        return Arrays.stream(array)
            .min()
            .orElseThrow(NoSuchElementException::new);
      }

      단위 테스트

      @Order(7)
      @DisplayName("findMinUsingForLoop: for 루프를 사용하여 배열 최소값 찾기")
      @Test
      void testFindMinUsingForLoop() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        int expectedMin = 2;
      
        // when
        int actualMin = arraySearch.findMinUsingForLoop(array);
      
        // then
        assertEquals(expectedMin, actualMin);
      }
      
      @Order(8)
      @DisplayName("findMin: 스트림을 사용하여 배열 최소값 찾기")
      @Test
      void testFindMin() {
      
        // given
        int[] array = new int[]{5, 3, 8, 4, 2};
        int expectedMin = 2;
      
        // when
        int actualMin = arraySearch.findMin(array);
      
        // then
        assertEquals(expectedMin, actualMin);
      }

       

      장단점

      장점

      • 직관적임: 순차 검색과 같은 단순 검색 방법은 이해하기 쉽습니다.
      • 효율적임: 정렬된 배열에서는 이진 검색을 사용하여 높은 검색 효율을 얻을 수 있습니다.
      • 유연함: 2차원 배열에서도 값을 검색할 수 있는 유연한 방법을 제공합니다.

      단점

      • 속도 제한: 순차 검색은 배열의 크기가 클 경우 검색 속도가 느려질 수 있습니다.
      • 정렬 필요: 이진 검색은 배열이 정렬되어 있어야만 사용할 수 있는 제한이 있습니다.

       

      결론

      자바에서 배열을 검색하는 다양한 방법을 살펴보았습니다. 순차 검색, 이진 검색, `Arrays.binarySearch` 메서드를 사용한 검색, 그리고 2차원 배열에서 특정 값의 존재 여부를 확인하는 방법을 통해 배열 데이터의 검색을 보다 효율적으로 처리할 수 있습니다. 또한, 배열에서 최대값과 최소값을 찾는 방법도 포함하였습니다.

       

      소스 코드는 Github Repository- https://github.com/tychejin1218/blog/tree/main/java-collection 프로젝트를 참조하세요.

      반응형

      댓글

    Designed by Tistory.