Programming/μ•Œκ³ λ¦¬μ¦˜

[사전] 이진탐색(μž¬κ·€, λΉ„μž¬κ·€, μˆ«μžλ§žμΆ”κΈ°)

ν•΄λ“œμœ„κ·Έ 2021. 10. 20. 00:07
λ°˜μ‘ν˜•

이진탐색 - μž¬κ·€ 버전

 

- x ≤ k λ₯Ό λ§Œμ‘±ν•˜λŠ” μ‚¬μ „μ˜ ν‚€ x 쀑 κ°€μž₯ 큰 κ°’μ˜ μœ„μΉ˜(즉, 인덱슀) 좜λ ₯

(μœ„μΉ˜λŠ” 0λΆ€ν„° μ‹œμž‘ν•œλ‹€κ³  κ°€μ •ν•˜κ³ , μœ„ μ‘°κ±΄μ„ λ§Œμ‘±ν•˜λŠ” xκ°€ μ—†λŠ” κ²½μš° –1 μΆœλ ₯)
- 즉, ν‚€ kκ°€ μ‘΄μž¬ν•˜λŠ” κ²½μš°μ—λŠ” k의 μœ„μΉ˜λ₯Ό 좜λ ₯ν•˜λ©΄ 되고, κ·Έλ ‡μ§€ μ•Šμ€ κ²½μš° k보닀 μž‘μœΌλ©΄μ„œ κ°€μž₯ ν° μˆ˜μ˜ μœ„μΉ˜λ₯Ό μΆœλ ₯ν•˜λ©΄ λœλ‹€.

 

μž…λ ₯ μ˜ˆμ‹œ 1
8 -7 β†¦ n = 8, k = –7

좜λ ₯ μ˜ˆμ‹œ 1
-92 -31 -7 4 14 20 29 44
β–‘2 β†¦ μ‚¬μ „μ—μ„œ -7의 μœ„μΉ˜λŠ” 2


μž…λ ₯ μ˜ˆμ‹œ 2
8 33 β†¦ n = 8, k = 33

좜λ ₯ μ˜ˆμ‹œ 2
-92 -31 -7 4 14 20 29 44
β–‘6 ↦ 문제 쑰건을 λ§Œμ‘±ν•˜λŠ” μ‚¬μ „μ˜ ν‚€λŠ” 29이고, μ‚¬μ „μ—μ„œ 29의 μœ„μΉ˜λŠ” 6

 

#include <stdio.h>
#include <stdlib.h>

int n;// λ°°μ—΄ 크기
int* D;//사전
int t;

int rFE(int k, int left, int right) {
	int mid;

	if (left > right)
		return -1;

	mid = (left + right) / 2;
	if (k == D[mid])
		return mid;
	else if (k < D[mid])
		return rFE(k, left, mid - 1);
	else {// if(k > D[mid])
		t = mid;
		return rFE(k, mid + 1, right);
	}

}

int findElement(int k) {
	return rFE(k, 0, n-1);
}

int main() {
	int k;// 탐색할 ν‚€ k
	int result;
	scanf("%d %d", &n, &k);

	D = (int*)malloc(n * sizeof(int));

	for (int i = 0; i < n; i++) {
		scanf("%d", &D[i]);
		getchar();
	}

	result = findElement(k);

	if (result == -1) {
		if (t != NULL)
			printf(" %d", t);
		else
			printf(" %d", result);
	}
	else
		printf(" %d", result);

	return 0;
}

 

 

이진탐색 - λΉ„μž¬κ·€ 버전

 

좜λ ₯ (문제 1κ³Ό μ•½κ°„ λ‹€λ¦„에 μ£Όμ˜)
- x ≥ k λ₯Ό λ§Œμ‘±ν•˜λŠ” μ‚¬μ „μ˜ ν‚€ x μ€‘ κ°€μž₯ μž‘은 κ°’μ˜ μœ„μΉ˜(즉, μΈλ±μŠ€) μΆœλ ₯
(μœ„μΉ˜λŠ” 0λΆ€ν„° μ‹œμž‘ν•œλ‹€κ³  κ°€μ •ν•˜κ³ , μœ„ μ‘°κ±΄μ„ λ§Œμ‘±ν•˜λŠ” xκ°€ μ—†λŠ” κ²½μš° n μΆœλ ₯)

 

μž…λ ₯ μ˜ˆμ‹œ 1
8 -100 β†¦ n = 8, k = -100
-92 -31 -7 4 14 20 29 44

좜λ ₯ μ˜ˆμ‹œ 1
β–‘0 ↦ 문제 쑰건을 λ§Œμ‘±ν•˜λŠ” μ‚¬μ „μ˜ ν‚€λŠ” -92이고, μ‚¬μ „μ—μ„œ -92의 μœ„μΉ˜λŠ” 0


μž…λ ₯ μ˜ˆμ‹œ 2
8 55 β†¦ n = 8, k = 55
-92 -31 -7 4 14 20 29 44

좜λ ₯ μ˜ˆμ‹œ 2
β–‘8 β†¦ 55보닀 ν° μ‚¬μ „μ˜ ν‚€λŠ” μ—†μŒ

 

#include <stdio.h>
#include <stdlib.h>

int n;// λ°°μ—΄ 크기
int* D;//사전
int t = -999999;

int findElement(int k) {
	int left = 0;
	int right = n - 1;
	int mid;

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

		if (k == D[mid])
			return mid;
		else if (k < D[mid]) {
			t = mid;
			right = mid - 1;
		}
		else {// if(k > D[mid])
			left = mid + 1;
		}
	}

	return -1;
}

int main() {
	int k;// 탐색할 ν‚€ k
	int result;
	scanf("%d %d", &n, &k);

	D = (int*)malloc(n * sizeof(int));

	for (int i = 0; i < n; i++) {
		scanf("%d", &D[i]);
		getchar();
	}

	result = findElement(k);

	if (result == -1) {
		if (t == -999999)
			printf(" %d", n);
		else
			printf(" %d", t);
	}
	else
		printf(" %d", result);

	return 0;
}

 

 

이진탐색을 μ‘μš©ν•œ 숫자 λ§žμΆ”κΈ° κ²Œμž„ (λΉ„μž¬κ·€ 방식 μ‚¬μš©ν•¨)

 

- μΉœκ΅¬λŠ”  k > m 인지, Y(예)/N(μ•„λ‹ˆμ˜€)으둜 μ•Œλ €μ€€λ‹€. (μ—¬κΈ°μ„œ m은 a와 bμ‚¬μ΄μ˜ μ€‘κ°„κ°’μœΌλ‘œ, m =ο€€(a + b)/2이닀. ο€€ο€€λŠ” λ‚΄λ¦Ό κΈ°ν˜Έ)
- λ‹΅μ΄ Y인 κ²½μš°, m + 1 ≤ k ≤ b μ΄λ―€λ‘œ a의 κ°’을 m + 1둜 λ°”κΎΌλ‹€.
- 닡이 N인 경우, a ≤ k ≤ m μ΄λ―€λ‘œ bλ₯Ό m으둜 λ°”κΎΌλ‹€.

 

μž…λ ₯ μ˜ˆμ‹œ 1
10 20 3 β†¦ a = 10, b = 20, Y/N의 κ°œμˆ˜ 3개
NNY

좜λ ₯ μ˜ˆμ‹œ 1
12 β†¦ k = 12


μž…λ ₯ μ˜ˆμ‹œ 2
1 1000 10 β†¦ a = 1, b = 1000, Y/N의 κ°œμˆ˜ 10개
NYYNYNYYNY

좜λ ₯ μ˜ˆμ‹œ 2
421 β†¦ k = 421

 

#include <stdio.h>
#include <stdlib.h>

//λΉ„μž¬κ·€

int findElement(int a, int b, int num, char str[]) {
	int mid;
	int k = 0, i = 0;

	while(1) {
		mid = (a + b) / 2;

		if (a == b) {
			k = mid;
			break;
		}

		if (str[i] == 'Y') {
			a = mid + 1;
		}
		else {
			b = mid;
		}
		i++;
	}

	return k;
}

int main() {
	int a, b, num;// a, b κ°’, Y/N의 갯수
	char str[1000];
	int k = 0;

	scanf("%d %d %d", &a, &b, &num);

	scanf("%s", str);

	k = findElement(a, b, num, str);
	printf("%d", k);

	return 0;
}
λ°˜μ‘ν˜•