Post

binary search

πŸ” Binary Search (이진 탐색)

이진 탐색(Binary Search)은 μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ • 값을 λΉ λ₯΄κ²Œ μ°ΎλŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
탐색 λ²”μœ„λ₯Ό μ ˆλ°˜μ”© 쀄여가며 μ›ν•˜λŠ” 값을 μ°ΎκΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„λŠ” O(log N) μž…λ‹ˆλ‹€.




βœ… λ™μž‘ 쑰건

  • 배열이 λ°˜λ“œμ‹œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ •λ ¬λ˜μ§€ μ•Šμ€ λ°°μ—΄μ—μ„œ 이진 탐색을 μˆ˜ν–‰ν•˜λ©΄ μ •ν™•ν•œ κ²°κ³Όλ₯Ό 보μž₯ν•  수 μ—†λ‹€.



⏱️ μ‹œκ°„ λ³΅μž‘λ„ 정리

| 경우 | μ‹œκ°„ λ³΅μž‘λ„ | 비ꡐ 횟수 (μ΅œλŒ€) | μ„€λͺ… | |β€”β€”|————–|β€”β€”β€”β€”β€”β€”|β€”β€”| | μ΅œμ„  | O(1) | 1 | midκ°€ μ²˜μŒλΆ€ν„° target일 λ•Œ | | 평균 | O(log N) | logβ‚‚N | 탐색 λ²”μœ„λ₯Ό 반볡적으둜 λ°˜μ”© μ€„μž„ | | μ΅œμ•… | O(log N) | logβ‚‚N | κ°€μž₯ 끝에 μžˆκ±°λ‚˜ μ—†λŠ” κ²½μš°κΉŒμ§€ 탐색 |




πŸ’‘ Java μ½”λ“œ μ˜ˆμ‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int[] nums = {1, 3, 7, 13, 5, 9};
		int target_num = 7;

		// μ •λ ¬λœ λ°°μ—΄μ—μ„œ 이진 탐색 μˆ˜ν–‰
		Arrays.sort(nums);  // ⭐ λ°˜λ“œμ‹œ μ •λ ¬ ν•„μš”
		int idx = binarySearch(nums, target_num);

		if (idx != -1) {
			System.out.println("찾은 idx : " + idx);
		} else {
			System.out.println("값을 λͺ» μ°Ύκ² λ‹€");
		}
	}

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

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

			if (arr[mid] == target) {
				return mid; // κ°’ 찾음
			} else if (arr[mid] < target) {
				left = mid + 1; // 였λ₯Έμͺ½ 탐색
			} else {
				right = mid - 1; // μ™Όμͺ½ 탐색
			}
		}

		return -1; // λͺ» 찾음
	}
}
1
찾은 idx : 2

πŸ’‘ Java μ½”λ“œ μ˜ˆμ‹œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int[] nums = {1, 3, 7, 13, 5, 9};
		int target_num = 7;

		// μ •λ ¬λœ λ°°μ—΄μ—μ„œ 이진 탐색 μˆ˜ν–‰
		Arrays.sort(nums);  // ⭐ λ°˜λ“œμ‹œ μ •λ ¬ ν•„μš”
		int idx = binarySearch(nums, target_num);

		if (idx != -1) {
			System.out.println("찾은 idx : " + idx);
		} else {
			System.out.println("값을 λͺ» μ°Ύκ² λ‹€");
		}
	}

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

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

			if (arr[mid] == target) {
				return mid; // κ°’ 찾음
			} else if (arr[mid] < target) {
				left = mid + 1; // 였λ₯Έμͺ½ 탐색
			} else {
				right = mid - 1; // μ™Όμͺ½ 탐색
			}
		}

		return -1; // λͺ» 찾음
	}
}
1
찾은 idx : 2





🎯 Lower Bound & Upper Bound

lower_bound 와 upper_boundλŠ” μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ • 값을 κΈ°μ€€μœΌλ‘œ 경계 인덱슀λ₯Ό μ°ΎλŠ” 이진 νƒμƒ‰μ˜ λ³€ν˜•μž…λ‹ˆλ‹€.


βœ… κ°œλ… μ •μ˜

ν•¨μˆ˜μ˜λ―Έ
lower_boundtarget 이상이 처음 λ‚˜μ˜€λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜
upper_boundtarget μ΄ˆκ³Όκ°€ 처음 λ‚˜μ˜€λŠ” μœ„μΉ˜λ₯Ό λ°˜ν™˜

πŸ“Œ λ‘˜ λ‹€ 값이 μ‘΄μž¬ν•˜μ§€ μ•Šλ”λΌλ„, κ·Έ 값이 β€œλ“€μ–΄κ°ˆ 수 μžˆλŠ” μžλ¦¬β€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
즉, μ‚½μž… μœ„μΉ˜λ‚˜ λ²”μœ„ ꡬ간 등에 ν™œμš©λ©λ‹ˆλ‹€.





🧠 μ˜ˆμ‹œ λ°°μ—΄

1
int[] arr = {1, 3, 3, 5, 7, 9};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class BoundsSearch {
    // μ •λ ¬λœ λ°°μ—΄μ—μ„œ target 이상 첫 μœ„μΉ˜
    public static int lowerBound(int[] arr, int target) {
        int left = 0;
        int right = arr.length;

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

    // μ •λ ¬λœ λ°°μ—΄μ—μ„œ target 초과 첫 μœ„μΉ˜
    public static int upperBound(int[] arr, int target) {
        int left = 0;
        int right = arr.length;

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

    public static void main(String[] args) {
        int[] arr = {1, 3, 3, 5, 7, 9};
        int target = 3;

        int lb = lowerBound(arr, target);
        int ub = upperBound(arr, target);

        System.out.println("lower_bound(3): " + lb); // 1
        System.out.println("upper_bound(3): " + ub); // 3
        System.out.println("3의 개수: " + (ub - lb)); // 2
    }
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags