Post

upperBound && lowerBound --> binary search

πŸ“Œ 이진 νƒμƒ‰μ—μ„œμ˜ lowerBound와 upperBound

ν•¨μˆ˜μ˜λ―Έμ‘°κ±΄λ°˜ν™˜κ°’
lowerBound(arr, x)x 이상(β‰₯)의 첫 μœ„μΉ˜arr[i] >= xxκ°€ 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜ λ˜λŠ” λ“€μ–΄κ°ˆ μœ„μΉ˜
upperBound(arr, x)x 초과(>)의 첫 μœ„μΉ˜arr[i] > xx보닀 큰 값이 처음 λ‚˜νƒ€λ‚˜λŠ” μœ„μΉ˜

이 두 ν•¨μˆ˜λŠ” μ •λ ¬λœ λ°°μ—΄μ—μ„œ x의 개수, μ‚½μž… μœ„μΉ˜ 등을 λΉ λ₯΄κ²Œ 찾을 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” 이뢄 탐색 기반 λ„κ΅¬μž…λ‹ˆλ‹€.




λ‹€μŒ 사진은 int[] my_cards 이닀

Desktop View

λ‚΄κ°€ κ°–κ³  μžˆλŠ” given_numbersλ₯Ό μ•„λž˜μ™€ κ°™λ‹€κ³  κ°€μ •ν•˜μž

1
int[] given_numbers = {17, 1, 2, 3, 4, -5};

μ—¬κΈ°μ„œ given_numbers에 ν•΄λ‹Ήλ˜λŠ” 숫자의 갯수만큼 μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•˜λ©΄ μ΄λŠ” μ•„λž˜μ™€ 같이 λ‚˜μ˜¬ 것이닀

1
{0, 1, 3, 2, 1, 0}

이 그림을 보면 target_number == 2일 λ•Œ,

lowerBoundλŠ” 첫 번째 2κ°€ λ‚˜μ˜€λŠ” μΈλ±μŠ€μ— μœ„μΉ˜ν•˜κ³ ,

upperBoundλŠ” 2λ₯Ό μ΄ˆκ³Όν•˜λŠ” 숫자인 3의 첫 번째 μΈλ±μŠ€μ— μœ„μΉ˜ν•˜λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.


이처럼 각 숫자의 개수λ₯Ό κ΅¬ν•˜κ³ μž ν•  λ•ŒλŠ” upperBound - lowerBound 연산을 톡해 μ‰½κ²Œ 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ target_number == 17이라면, lowerBound와 upperBound λͺ¨λ‘ 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 7μ΄λΌλŠ” λ™μΌν•œ μœ„μΉ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 즉,

java μ½”λ“œ 볡사 upperBound - lowerBound = 7 - 7 = 0 이 λ˜μ–΄ ν•΄λ‹Ή μˆ«μžκ°€ 배열에 μ‘΄μž¬ν•˜μ§€ μ•ŠμŒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” κ·Έλ¦Όμ—μ„œλ„ 17이 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μžμ—°μŠ€λŸ½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.



λ°±μ€€ 10816 μˆ«μžμΉ΄λ“œ2

μ‹€μ „ μ—°μŠ΅μœΌλ‘œ λ°±μ€€ 문제λ₯Ό ν’€μ–΄λ΄…μ‹œλ‹€ https://www.acmicpc.net/problem/10816

Desktop View



πŸ’‘μ•„μ΄λ””μ–΄

값이 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우, 두 경계 λͺ¨λ‘ arr.lengthκ°€ λ˜μ–΄

1
upperBound - lowerBound = 0

이 μžλ™μœΌλ‘œ μ„±λ¦½λ˜κ²Œ λ§Œλ“ λ‹€.

이λ₯Ό μœ„ν•΄ 각 ν•¨μˆ˜μ—μ„œ res = arr.length둜 μ΄ˆκΈ°ν™”ν•©μ‹œλ‹€.

🧾 ν…ŒμŠ€νŠΈ μ˜ˆμ‹œ

1
2
3
4
5
6
7
8
9
# μ˜ˆμ œμž…λ ₯ 2
10
6 3 2 10 10 10 -10 -10 7 3
8
10 17 -5 2 3 4 5 -10


# 좜λ ₯κ²°κ³Ό 2
3 0 0 1 2 0 0 2

πŸ’»λ‚΄κ°€ μž‘μ„±ν•œ μ½”λ“œ

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;

import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		String[] N_arr = br.readLine().split(" ");
		int[] my_cards = str_to_int(N_arr);
		Arrays.sort(my_cards);
		
		
		int M = Integer.parseInt(br.readLine());
		String[] M_arr = br.readLine().split(" ");
		int[] given_cards = str_to_int(M_arr);
		
		
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < M ; i++) {
			int target_num = given_cards[i];
			int upper = upperBound(my_cards, target_num);
			int lower = lowerBound(my_cards, target_num);
			if (i < M-1) {
				sb.append(upper - lower + " ");
			}
			else {
				sb.append(upper - lower);
			}
		}
		System.out.println(sb.toString().trim());
		
	}
	
	public static int upperBound(int[] my_cards, int target_num) {
		int left = 0;
		int right = my_cards.length - 1;
		int res = my_cards.length;
		
		while (left <= right) {
			int mid = (left + right) / 2;
			if (my_cards[mid] <= target_num) {
				left = mid + 1;
			}
			else if (my_cards[mid] > target_num) {
				res = mid;
				right = mid - 1;
			}
		}
		return res;
	}
	
	
	
	public static int lowerBound(int[] my_cards, int target_num) {
		int left = 0;
		int right = my_cards.length - 1;
		int res = my_cards.length;
		
		while (left <= right) {
			int mid = (left + right) / 2;
			if (my_cards[mid] < target_num) {
				left = mid + 1;
			}
			else if (my_cards[mid] >= target_num) {
				res = mid;
				right = mid - 1;
			}
		}
		return res;
	}
	
	
	
	
	
	public static int[] str_to_int(String[] arr) {
		int[] res = new int[arr.length];
		for (int i = 0; i < res.length; i++) {
			res[i] = Integer.parseInt(arr[i]);
		}
		return res;
	}
	
}
This post is licensed under CC BY 4.0 by the author.

Trending Tags