Hello Kitty Eyes Shut
λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ’» μ½”ν…Œ/πŸ“Œ C

[λ°±μ€€][Cμ–Έμ–΄] #10815 숫자 μΉ΄λ“œ

λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”, μ½”λ”©ν•˜λŠ” μ†Œμ—°μž…λ‹ˆλ‹€ !πŸ₯°

이번 글은 λ°±μ€€ 10815번 숫자 μΉ΄λ“œ 문제λ₯Ό Cμ–Έμ–΄λ‘œ ν‘Ό 것에 λŒ€ν•œ κΈ°λ‘μž…λ‹ˆλ‹€.

 

사진을 ν΄λ¦­ν•˜λ©΄ 문제λ₯Ό λ³Ό 수 μžˆμ–΄μš” !

 

1. 문제

숫자 μΉ΄λ“œλŠ” μ •μˆ˜ ν•˜λ‚˜κ°€ μ ν˜€μ Έ μžˆλŠ” μΉ΄λ“œμ΄λ‹€. μƒκ·Όμ΄λŠ” 숫자 μΉ΄λ“œ N개λ₯Ό κ°€μ§€κ³  μžˆλ‹€. μ •μˆ˜ Mκ°œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 μˆ˜κ°€ μ ν˜€μžˆλŠ” 숫자 μΉ΄λ“œλ₯Ό 상근이가 κ°€μ§€κ³  μžˆλŠ”μ§€ μ•„λ‹Œμ§€λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

2. μ†ŒμŠ€ μ½”λ“œ

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

int binary_search(const int a[], int n, int key)
{
	int start = 0;
	int end = n - 1;
	int mid;

	do {
		mid = (start + end) / 2;

		if (a[mid] == key)
			return 1;
		else if (a[mid] < key)
			start = mid + 1;
		else
			end = mid - 1;
	} while (start <= end);

	return 0;
}

int compare(const int* a, const int* b)
{
	if (*a < *b)
		return -1;
	else if (*a > *b)
		return 1;
	else
		return 0;
}

int main(void)
{
	int i;
	int n, m;
	int* arr1;
	int* arr2;

	scanf("%d", &n);

	arr1 = (int*)calloc(n, sizeof(int));

	for (i = 0; i < n; i++)
		scanf("%d", &arr1[i]);

	scanf("%d", &m);

	arr2 = (int*)calloc(m, sizeof(int));

	for (i = 0; i < m; i++)
		scanf("%d", &arr2[i]);

	qsort(arr1, n, sizeof(int), (int(*)(const void*, const void*))compare);

	for (i = 0; i < m; i++)
	{
		printf("%d ", binary_search(arr1, n, arr2[i]));
	}

	free(arr1);
	free(arr2);

	return 0;
}

 

 
 

3. 풀이

μš°μ„  μš°λ¦¬λŠ” 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œμ˜ κ°œμˆ˜μ™€ 각 μΉ΄λ“œμ— 적힌 μˆ˜λ“€μ„ μ €μž₯해두어야 ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ scanfλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžλ‘œλΆ€ν„° 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œμ˜ 개수 n을 μž…λ ₯받은 ν›„,

calloc을 μ΄μš©ν•˜μ—¬ 크기가 n이고 0으둜 μ΄ˆκΈ°ν™” 된 1차원 동적 λ°°μ—΄ arr1을 λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

이후 λ°˜λ³΅λ¬Έμ„ 돌며 각 숫자 μΉ΄λ“œμ— 적힌 μˆ˜λ“€μ„ μ‚¬μš©μžλ‘œλΆ€ν„° μž…λ ₯λ°›μ•„ arr1 배열에 μ €μž₯ν•΄μ£Όλ©΄ 되겠죠?

 

λ‹€μŒμœΌλ‘œ μš°λ¦¬λŠ” μ£Όμ–΄μ§„ 숫자 μΉ΄λ“œμ˜ κ°œμˆ˜μ™€ 각 μΉ΄λ“œμ— 적힌 μˆ˜λ“€λ„ μ €μž₯해두어야 ν•©λ‹ˆλ‹€.

μ•žμ—μ„œ ν•œ 방법과 λ™μΌν•˜κ²Œ ν•˜λ©΄ 되겠죠?

μ£Όμ–΄μ§„ 숫자 μΉ΄λ“œμ— 적힌 μˆ˜λ“€μ€ arr2에 μ €μž₯ν•΄λ‘κ² μŠ΅λ‹ˆλ‹€.

 

이제 μš°λ¦¬λŠ” μ£Όμ–΄μ§„ 숫자 μΉ΄λ“œμ— 적힌 μˆ˜κ°€ 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œμ—λ„ μžˆλŠ”μ§€λ₯Ό 확인해야 ν•©λ‹ˆλ‹€.

 

μ €λŠ” μ²˜μŒμ— λ‹¨μˆœν•˜κ²Œ 2쀑 for문을 μ‚¬μš©ν•˜μ—¬ μ£Όμ–΄μ§„ μΉ΄λ“œμ— 적힌 μˆ˜μ™€ 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œμ— 적힌 수λ₯Ό λͺ¨λ‘ λΉ„κ΅ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ΄λ ‡κ²Œ ν•˜λ©΄ μ‹œκ°„ μ΄ˆκ³Όκ°€ λœ¨λ”λΌκ΅¬μš”..😒

 

κ·Έλž˜μ„œ 생각해낸 방법이 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œλ“€μ„ μš°μ„  μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„,

이진 탐색을 ν•˜μ—¬ μ£Όμ–΄μ§„ 숫자 μΉ΄λ“œμ— μžˆλŠ” 수λ₯Ό 상근이가 κ°€μ§€κ³  μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€!

 

λ”°λΌμ„œ μš°μ„  qsortλ₯Ό ν™œμš©ν•˜μ—¬ arr1에 μ €μž₯된 상근이가 κ°€μ§€κ³  μžˆλŠ” 숫자 μΉ΄λ“œλ“€μ„ μ˜€λ¦„ 차순으둜 μ •λ ¬ν•΄μ€λ‹ˆλ‹€.

그리고 for문을 돌며 μ£Όμ–΄μ§„ 숫자 μΉ΄λ“œμ— μ ν˜€μžˆλŠ” 수λ₯Ό 상근이가 κ°€μ§€κ³  μžˆλŠ”μ§€ binary_search ν•¨μˆ˜λ₯Ό 톡해 ν™•μΈν•˜λ©°

κ°€μ§€κ³  μžˆλ‹€λ©΄ 1을, κ°€μ§€κ³  μžˆμ§€ μ•Šλ‹€λ©΄ 0을 λ°”λ‘œλ°”λ‘œ 좜λ ₯ν•˜λ„λ‘ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

λ§ˆμ§€λ§‰μœΌλ‘œ μš°λ¦¬κ°€ μ‚¬μš©ν–ˆλ˜ λ©”λͺ¨λ¦¬λ“€μ„ λ‹€μ‹œ λ°˜ν™˜ν•΄μ£Όμ–΄μ•Ό 되겠죠?

freeλ₯Ό 톡해 arr1κ³Ό arr2 배열을 λ§Œλ“€κΈ° μœ„ν•˜μ—¬ μ‚¬μš©ν–ˆλ˜ λ©”λͺ¨λ¦¬λ“€μ„ λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€.

λ°˜μ‘ν˜•

'πŸ’» μ½”ν…Œ > πŸ“Œ C' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[λ°±μ€€][Cμ–Έμ–΄] #1110 λ”ν•˜κΈ° 사이클  (0) 2022.07.04