[μ¬μ ] μ΄μ§νμ(μ¬κ·, λΉμ¬κ·, μ«μλ§μΆκΈ°)
μ΄μ§νμ - μ¬κ· λ²μ
- 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;
}