문제
스네이크버드는 뱀과 새의 모습을 닮은 귀여운 생물체입니다.
스네이크버드의 주요 먹이는 과일이며 과일 하나를 먹으면 길이가 1만큼 늘어납니다.
과일들은 지상으로부터 일정 높이를 두고 떨어져 있으며 i (1 ≤ i ≤ N) 번째 과일의 높이는 hi입니다.
스네이크버드는 자신의 길이보다 작거나 같은 높이에 있는 과일들을 먹을 수 있습니다.
스네이크버드의 처음 길이가 L일때 과일들을 먹어 늘릴 수 있는 최대 길이를 구하세요.
조건 및 입출력
- 첫 번째 줄에 과일의 개수 N (1 ≤ N ≤ 1,000) 과 스네이크버드의 초기 길이 정수 L (1 ≤ L ≤ 10,000) 이 주어집니다.
두 번째 줄에는 정수 h1, h2, ..., hN (1 ≤ hi ≤ 10,000) 이 주어집니다.
- 첫 번째 줄에 스네이크버드의 최대 길이를 출력합니다.
- 시간 제한: 1초 이내 / 메모리 제한: 128MB 이내
코드 (C99)
#include <stdio.h>
//프로토타입 선언부
void heap_sort(int heap[], int size);
//전역변수 선언부
int feeds[10000] = { 0 };
main()
{
int test, snake;
scanf("%d %d", &test, &snake);
for (int i = 0; i < test; i++)
scanf("%d", &feeds[i]);
heap_sort(feeds, test);
for (int i = 0; i < test; i++)
{
if (snake < feeds[i])
break;
snake++;
}
printf("%d", snake);
return 0;
}
void heap_sort(int heap[], int size)
{
for (int i = 1; i < size; i++)
{
int child = i;
do
{
int root = (child - 1) / 2;
if (heap[root] < heap[child])
{
int temp = heap[root];
heap[root] = heap[child];
heap[child] = temp;
}
child = root;
} while (child != 0);
}
for (int i = size - 1; i >= 0; i--)
{
int temp = heap[0];
heap[0] = heap[i];
heap[i] = temp;
int root = 0;
int child = 1;
do
{
child = 2 * root + 1;
if (child < i - 1 && heap[child] < heap[child + 1])
child++;
if (child < i && heap[root] < heap[child])
{
temp = heap[root];
heap[root] = heap[child];
heap[child] = temp;
}
root = child;
} while (child < i);
}
}
여담
우선 먹이의 높이 데이터를 받는다. 그리고 초기 뱀의 길이에 대한 데이터도 받는다.
그 후 먹이의 높이를 저장할 수 있는 배열에 값을 저장하고, 배열을 정렬한다.
정렬의 방식은 어려가지가 있겠으나, 나는 힙 정렬을 선호하므로 힙 정렬을 이용하여 배열을 오름차순 정렬했다.
이후, for문을 돌면서 과일 나무보다 스네이크버드가 작으면 루프를 탈출하고, 그렇지 않으면 +1을 해준다. (먹이를 먹었으므로)
그렇게 해서 루프가 종료(탈출)되면 최종 스네이크버드의 길이를 출력하면 정답이다.
| 코드가 이상하거나 이해되지 않는 부분이 있다면 댓글 남겨주세요! + 더 좋은 풀이 방법이 있다면 알려주세요 :) |
'Programming > C언어' 카테고리의 다른 글
| [백준] 9461번 : 파도반 수열 (C언어 / C99) (0) | 2023.08.20 |
|---|---|
| [백준] 1758번 : 알바생 강호 (C언어 / C99) (0) | 2023.08.19 |
| [백준] 2217번 : 로프 (C언어 / C99) (0) | 2023.08.16 |
| [백준] 1439번 : 뒤집기 (C언어 / C99) (0) | 2023.08.14 |
| [백준] 7567번 : 그릇 (C언어 / C99) (0) | 2023.08.11 |