CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ด์ง„ ํƒ์ƒ‰(์ด๋ถ„ ํƒ์ƒ‰)

๋ฒผ๋ฆฌ01 2024. 8. 9. 17:08

๐Ÿ“Œ์ด์ง„ ํƒ์ƒ‰(Binary Search)

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’๊ณผ ์ฐพ๊ณ ์žํ•˜๋Š” ํ‚ค๊ฐ’์˜ ๋Œ€์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ, ๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด๊ฐ€๋ฉฐ ๊ฐ’์˜ ์œ ๋ฌด๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒ€์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ค‘๊ฐ„๊ฐ’์ด ํ‚ค๊ฐ’๋ณด๋‹ค ํฌ๋ฉด ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ ๋ฐฐ์—ด์˜ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๋‹ค์‹œ ํƒ์ƒ‰ํ•˜๊ณ , ์ค‘๊ฐ„๊ฐ’์ด ํ‚ค๊ฐ’๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์™ผ์ชฝ ๋ฐฐ์—ด์—์„œ ์žฌํƒ์ƒ‰ํ•œ๋‹ค. ํ•œ ๋ฒˆ ๋น„๊ตํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด์ด ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋”๋ผ๋„ ๊ฒ€์ƒ‰ ํšจ์œจ์ด ์ข‹๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” `O(logN)`.  ๋‹จ, ํ‚ค๊ฐ’๊ณผ ์ค‘๊ฐ„๊ฐ’์˜ ๋Œ€์†Œ๋ฅผ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์ด ๋ฐ˜๋“œ์‹œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. 

 

 

 

๐Ÿ“Œ๊ตฌํ˜„

์–ธ์–ด: C

 

#include <stdio.h>

int BinarySearch(int* arrPtr, int lower, int upper, int middle, int key) {

	// ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜
	if (arrPtr[middle] == key) {
		return middle;
	}

	// ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ
	if (middle <= lower || middle >= upper) {
		return -1;
	}

	// key๊ฐ€ arrPtr[middle]๋ณด๋‹ค ์ž‘์œผ๋ฉด ์™ผ์ชฝ, ํฌ๋ฉด ์˜ค๋ฅธ์ชฝ
	if (key < arrPtr[middle]) {
		upper = middle;
	}else {
		lower = middle;
	}


	return BinarySearch(arrPtr, lower, upper, (lower + upper) / 2, key);
}


int main() {

	int arr[] = { 2,6,13,19,21,21,23,29,35,48,62,89,90,95,99,102,109,208,629 };

	int input;
	printf("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”:");
	scanf_s("%d", &input);

	int lower = 0;
	int upper = sizeof(arr) / sizeof(arr[0]);
	int middle = upper / 2;

	int result = BinarySearch(arr, lower, upper, middle, input);
	if(result != -1){
        printf("์ฐพ๋Š” ๊ฐ’์€ %d๋ฒˆ์งธ์— ์žˆ์Šต๋‹ˆ๋‹ค.\n", result + 1);
    }else{
		printf("์ฐพ๋Š” ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.\n");
    }

	return 0;
}