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.
3D GIF

Trending Tags

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด
๋‚˜๋ฅผ ๋ˆŒ๋Ÿฌ ๊ตฌ๋ฆฌ๐Ÿป
์ฑ—๋ด‡
๋„ˆ๊ตด
bot
์–ด์„œ์™€ ๊ตฌ๋ฆฌ ส• ยทแดฅยทส”
๋ฌด์—‡์ด ํ•„์š”ํ•˜์…” ๊ตฌ๋ฆฌ?

Trending Tags

๋„์›€์ด ํ•„์š”ํ•˜๋ฉด
๋‚˜๋ฅผ ๋ˆŒ๋Ÿฌ ๊ตฌ๋ฆฌ๐Ÿป
์ฑ—๋ด‡
๋„ˆ๊ตด
bot
์–ด์„œ์™€ ๊ตฌ๋ฆฌ ส• ยทแดฅยทส”
๋ฌด์—‡์ด ํ•„์š”ํ•˜์…” ๊ตฌ๋ฆฌ?