ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

์ด์ง„ํƒ์ƒ‰ - ์žฌ๊ท€ ๋ฒ„์ „

 

- 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;
}
๋ฐ˜์‘ํ˜•