728x90
▶문제 : Lower Bound (codeup.kr)
▶코드 작성
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, k, i, ct, right, left;
int *arr;
scanf("%d %d", &n, &k);
arr = (int *)malloc(sizeof(int) * n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
if (k > arr[n - 1])//모든 숫자가 k보다 클 때
{
printf("%d", n + 1);
return 1;
}
left = 0;
right = n - 1;
while (left <= right)
{
ct = (left + right) / 2;//배열 중앙값
if (k < arr[ct]) right = ct - 1;//배열 오른쪽(중앙값보다 큼)에 있을 때
else if (k > arr[ct]) left = ct + 1;//배열 왼쪽(중앙값보다 작음)에 있을 때
else if (k == arr[ct]) break;
}
if (k > arr[ct])//k값이 배열에 없을 때
{
while (k < arr[ct++]);
}
else
{
while (ct > 0)
{
if (k > arr[ct - 1]) break;//k값인 배열중 맨 앞 자리 찾기
else ct--;
}
}
printf("%d", ct + 1);
free(arr);
return 0;
}
▶해석
배열이 오름차순이므로 이분 탐색을 사용함. 중앙값을 이용하여 k값을 찾아냄.
728x90
'코드업(codeup) > C' 카테고리의 다른 글
코드업(codeup) 2024 : 숫자를 한글로 변환 C언어 (0) | 2021.11.27 |
---|---|
코드업(codeup) 1920 : (재귀함수) 2진수 변환 C언어 (0) | 2021.11.20 |
코드업(codeup) 1173 : 30분전 C언어 (0) | 2021.11.16 |
코드업(codeup) 3321 : 최고의 피자 C언어 (0) | 2021.11.16 |
코드업(codeup) 3301 : 거스름돈 C언어 (0) | 2021.11.16 |
댓글