본문 바로가기

삼성전자 알고리즘/정올

9. 2581 : 예산

문제 출처 : http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1842&sca=50&sfl=wr_subject&stx=%EC%98%88%EC%82%B0&sop=and

 

JUNGOL | 예산 > 문제은행

제한시간: 1000 ms    메모리제한: 32 MB 해결횟수: 771 회    시도횟수: 2997 회    국가의 역할 중 하나는 여러 지방의 예산요청을 심사하여 국가의 예산을 분배하는 것이다.  국가예산의 총액은 미리 정해져 있어서 모든 예산요청을 배정해 주기는 어려울 수도 있다.  그래서 정해진 총액 이하에서 가능한 한 최대의 총 예산을 다음과 같은 방법으로 배정한다. (1) 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정한다. (2

jungol.co.kr

문제 풀이 :

#include <stdio.h>

int N, M;
int arr[10001];//지방의 최대 수
int sum_don = 0;
int solve(int m) {
	//도시별 상한가 이하이면 그대로 배정하고
	//아니면 상한가로 배정하여
	//N개의 도시의 예산 합계를 리턴
	sum_don = 0;
	for (int i = 0; i < N; i++) {
		if (arr[i] <= m) {
			//상한가를 넘으면 상한가를 넣어준다.
			sum_don += arr[i];
		}
		else {
			sum_don += m;

		}
	}
	//상한가를 넘지 않는 도시 예산의 총합
//  printf("%d\n", sum_don);
	return sum_don;
}
int main() {
	int i, m, s = 0, e = 0, sol = 0;
	scanf("%d", &N);    //지방의 수
	for (i = 0; i < N; i++) {
		scanf("%d", &arr[i]);
		if (e < arr[i]) e = arr[i];  //예산액중 max값
	}
	scanf("%d", &M);

	while (s <= e) {
		m = (s + e) / 2;    //상한가를 mid로 계산

		if (solve(m) <= M) {
			//총액 이내에 만족한다면 예산액을 늘려본다
			sol = m;
			s = m + 1;
		}
		else {
			//총액을 초과하면 예산액을 줄여본다.
			e = m - 1;
		}
	}
	printf("%d\n", sol);
	return 0;
}

 

이진탐색의 범위를 정하고 (s는 0 e는 예산액 중 MAX값) 총액에 만족할 때 까지 mid 값을 이진탐색 한다. 이 때 주의 해야 할 점은 문제에 따라 예산의 합계가 정수 범위를 넘어 갈 수 있기 때문에 문제 조건을 잘 보고 int로 선언할 지 long long int로 선언할지 정해야 한다.

'삼성전자 알고리즘 > 정올' 카테고리의 다른 글

11. 1318 : 못생긴 수  (0) 2019.06.16
10. 2788 : 도약  (0) 2019.06.16
8. 1889 : N Queen [DFS]  (0) 2019.06.16
7. 1169 : 주사위 던지기1[DFS]  (0) 2019.06.16
5. 1078 : 저글링 방사능 오염  (0) 2019.06.16