백준[baekjoon]/C언어

백준(baekjoon) [C] - 1417번: 국회의원 선거

_KTH_ 2023. 2. 6. 17:56
728x90

https://www.acmicpc.net/problem/1417

 

1417번: 국회의원 선거

첫째 줄에 후보의 수 N이 주어진다. 둘째 줄부터 차례대로 기호 1번을 찍으려고 하는 사람의 수, 기호 2번을 찍으려고 하는 수, 이렇게 총 N개의 줄에 걸쳐 입력이 들어온다. N은 50보다 작거나 같

www.acmicpc.net


~~ 1 ~~

#include <stdio.h>  // 국회의원 선거
#include <stdlib.h>

int compare(void* first, void* second)
{
	int* a = first;
	int* b = second;
	if (*a > *b)
		return -1;
	else if (*a < *b)
		return 1;
	else
		return 0;
}


int main()
{
	int n;
	scanf("%d", &n);

	int num1;
	scanf("%d", &num1);

	int max = 0, arr[50];
	for (int i = 0; i < n - 1; i++)
	{
		scanf("%d", &arr[i]);
	}

	int cnt = 0;
	while (1)
	{
		// 내림차순 정렬
		qsort(arr, n - 1, sizeof(int), compare);

		if (num1 > arr[0])
			break;

		// 가장 큰 수 -1, 기호 1번 +1
		num1 += 1;
		arr[0] -= 1;
		cnt++;
	}
	printf("%d", cnt);


	return 0;
}

~~ 2 ~~

#include <stdio.h>  // 국회의원 선거
#include <stdlib.h>

typedef struct
{
	int data;
}node;

typedef struct
{
	node arr[50];
	int size;
}HEAP;

void push(HEAP* h, int data)
{
	int i;
	i = ++(h->size);

	while ((i != 1) && (data > h->arr[i / 2].data))
	{
		h->arr[i].data = h->arr[i / 2].data;
		i /= 2;
	}
	h->arr[i].data = data;
}

int pop(HEAP* h)
{
	int root, temp;
	root = h->arr[1].data;
	temp = h->arr[(h->size)--].data;

	int parent = 1;
	int child = 2;

	while (child <= h->size)
	{
		if ((child < h->size) && (h->arr[child].data < h->arr[child + 1].data))
		{
			child++;
		}

		if (temp >= h->arr[child].data)
			break;

		h->arr[parent].data = h->arr[child].data;
		parent = child;
		child *= 2;
	}
	h->arr[parent].data = temp;

	return root;
}


int main()
{
	int n;
	scanf("%d", &n);

	int num1;
	scanf("%d", &num1);

	HEAP h;
	h.size = 0;

	for (int i = 0; i < n - 1; i++)
	{
		int data;
		scanf("%d", &data);
		push(&h, data);
	}

	int cnt = 0;
	while (1)
	{
		int POP = pop(&h);
		if (num1 > POP)
			break;
		if (POP >= num1)
		{
			num1++;
			POP--;
			cnt++;
			push(&h, POP);
		}
	}
	printf("%d", cnt);


	return 0;
}

MEMO

[1]

-- 기호1번 수는 따로 저장, 나머지 수는 arr배열에 저장

-- arr 내림차순 정렬 후 가장큰 수(arr[0]) 보다 기호1번이 작다면 arr[0]--, num++, cnt++ 해주기

-- 기호1번이 가장 큰 수보다 더 커지면 break

[2]

-- 최대힙을 통해서 구현

-- 내용은 [1]과 유사

 

!! 필요할땐 변수 생성 꼭 하기 !!

728x90
728x90