ν‹°μŠ€ν† λ¦¬ λ·°

문제 1: μ •λ ¬λ˜μ–΄ μžˆλŠ” n개의 μ •μˆ˜ ν‚€(사전)와 탐색할 ν‚€ k1, k2λ₯Ό μž…λ ₯λ°›μ•„, μ‚¬μ „μ—μ„œ k1 ≤ k ≤ k2 λ₯Ό λ§Œμ‘±ν•˜λŠ” μœ„μΉ˜λ“€μ„ μΆœλ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

 

- μž¬κ·€ 버전 κ΅¬ν˜„

 

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

좜λ ₯ μ˜ˆμ‹œ 1
β–‘2 3 4 ↦ μ‚¬μ „μ—μ„œ -7의 μœ„μΉ˜λŠ” 2, 15보닀 μž‘μœΌλ©΄μ„œ κ°€μž₯ ν° μœ„μΉ˜λŠ” 4


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

좜λ ₯ μ˜ˆμ‹œ 2
β–‘-1 β†¦ λ¬Έμ œ μ‘°κ±΄μ„ λ§Œμ‘±ν•˜λŠ” μ‚¬μ „μ˜ ν‚€ μ—†μŒ

 

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

int t1 = 0;
int t2 = NULL;

int rFE(int k, int left, int right, int X[]) {
	int mid;

	if (left > right)
		return -1;

	mid = (left + right) / 2;
	if (k == X[mid])
		return mid;
	else if (k < X[mid]) {
		t1 = mid;
		return rFE(k, left, mid - 1, X);
	}
	else {
		t2 = mid;
		return rFE(k, mid + 1, right, X);
	}
}

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

int main() {
	int n, k1, k2;
	int* X;
	int a, b;

	scanf("%d %d %d", &n, &k1, &k2);

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

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

	a = findElement(k1, n, X);
	if (a == -1) {
		if (t1 != 0)
			a = t1;
	}

	b = findElement(k2, n, X);
	if (b == -1) {
		if (t2 != NULL)
			b = t2;
	}

	if ((a != -1 && b != -1) && (a <= b)) {
		for (int i = a; i <= b; i++) {
			printf(" %d", i);
		}
	}
	else
		printf(" -1");

	free(X);

	return 0;
}

* rFEν•¨μˆ˜μ—μ„œ μž¬κ·€ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ν•˜λ‹ˆκΉŒ return rFE(~~~) 해야함.

** x[mid] κ°’μ΄λž‘ 비ꡐ할 λ•Œ xλ°°μ—΄ μ•ˆμ— mid λ„£λŠ”κ±° μžŠμ§€μ•ŠκΈ°!!!!!!!!!!!!!

 

 

문제 2: ν•΄λ‹Ή 배열이 단일λͺ¨λ“œ 배열인지 확인 & ν•΄λ‹Ή λ°°μ—΄μ˜ μ΅œλŒ€ ν‚€ ν˜Ήμ€ μ΅œμ†Œ ν‚€λ₯Ό 좜λ ₯

 

- ν¬κΈ°κ°€ n인 λ°°μ—΄μ„ λ™μ  ν• λ‹Ήν•˜μ—¬, μž…λ ₯된 μ‚¬μ „μ˜ ν‚€ μ €μž₯(쀑볡 ν‚€λŠ” μ—†λ‹€κ³  κ°€μ •)
- ν•΄λ‹Ή λ°°μ—΄μ΄ λ‹¨μΌλͺ¨λ“œμΈμ§€ ν™•μΈ (증가→κ°μ†Œ / κ°μ†Œ→증가)
- μ΄μ§„탐색과 μœ μ‚¬ν•œ ν˜•νƒœλ‘œ ν•΄λ‹Ή λ°°μ—΄μ˜ μ΅œλŒ€ ν‚€ ν˜Ήμ€ μ΅œμ†Œ ν‚€ μΆœλ ₯ – O(log n) μ‹œκ°„ ν•„μš”

 

μž…λ ₯ μ˜ˆμ‹œ 1
9 β†¦ n=9
-21 8 12 13 35 41 23 20 17

좜λ ₯ μ˜ˆμ‹œ 1
β–‘1 41 β†¦ μ¦κ°€→κ°μ†Œ λ‹¨μΌλͺ¨λ“œ 1 / μ΅œλŒ€κ°’ 41


μž…λ ₯ μ˜ˆμ‹œ 2
9 β†¦ n=9
-21 8 12 13 -1 41 23 20 17

좜λ ₯ μ˜ˆμ‹œ 2
β–‘0 β†¦ λ‹¨μΌλͺ¨λ“œ λ°°μ—΄ μ•„λ‹˜ 0

 

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 단일λͺ¨λ“œ

int check(int *x, int n) {
	int flag = 0;
	int t1 = 0, t2 = 0;// 갯수 체크
	for (int i = 0; i < n-1; i++) {
		if (x[i] < x[i + 1]) {
			flag = 1;
			t1++;
		}
		else if (flag == 1) {
			for (int j = i; j < n-1; j++) {
				if (x[j] > x[j + 1]) {
					t1++;
					flag = 2;
					i++;
				}
			}
		}
		if (t1 == n-1) {
			flag = 1;
			break;
		}
		else if (flag == 2) {
			break;
		}
	}

	if (t1 != n - 1 && (flag == 1 || flag == 0)) {
		for (int i = 0; i < n - 1; i++) {
			if (x[i] > x[i + 1]) {
				flag = -1;
					t2++;
			}
			else if (flag == -1) {
				for (int j = i; j < n - 1; j++) {
					if (x[j] < x[j + 1]) {
						t2++;
						flag = 2;
						i++;
					}
				}
			}
			if (t2 == n - 1) {
				flag = -1;
				break;
			}
			else if (flag == 2) {
				break;
			}
		}
	}

	return flag;
}

int findMaxOfUnimodalArray(int* x, int n) {
	int a = 0;
	int b = n - 1;
	int mid;

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

		if (x[mid] < x[mid + 1])
			a = mid + 1;
		if (x[mid] > x[mid + 1])
			b = mid;
	}

	return x[a];
}

int findMinOfUnimodalArray(int* x, int n) {
	int a = 0;
	int b = n - 1;
	int mid;

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

		if (x[mid] > x[mid + 1])
			a = mid + 1;
		if (x[mid] < x[mid + 1])
			b = mid;
	}

	return x[a];
}

int main() {
	int n, * x;
	int chk, r;

	scanf("%d", &n);

	x = (int*)malloc(sizeof(int) * n);
	if (x == NULL) {
		printf("Not enough memory!");
		return -1;
	}

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

	//단일λͺ¨λ“œ 확인
	chk = check(x, n);
	
	if (chk == 1) {//단일λͺ¨λ“œ 증->감
		r = findMaxOfUnimodalArray(x, n);
		printf(" %d %d", chk, r);
	}
	else if (chk == -1) {//단일λͺ¨λ“œ 감->증
		r = findMinOfUnimodalArray(x, n);
		printf(" %d %d", chk, r);
	}
	else {// 단일λͺ¨λ“œ γ„΄γ„΄
		printf(" 0");
	}

	free(x);

	return 0;
}

 

λ°˜μ‘ν˜•