-
[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 프로젝트를 참조하세요.
반응형'Java > Collection(컬렉션)' 카테고리의 다른 글
[JAVA] 배열 회전하기 (1) 2024.09.17 [JAVA] 배열의 합 구하기 (1) 2024.09.17 [JAVA] 배열 정렬하기 : 오름차순, 내림차순 (1) 2024.09.17 [Java] 배열(Array)을 리스트(List)로 변환 - 반복문, Arrays, Collection, Stream (0) 2023.05.06 [Java] List 중복 제거 (HashSet, TreeSet, Stream) (0) 2019.12.16