[C++] 백준 2512 - 예산

2023. 8. 5. 13:14·알고리즘 문제풀이/백준
반응형

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

 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net

<알고리즘 분류>

   -  이분 탐색 (Binary Search)

 

<풀이> 

  1. 국가예산의 총액은 한정되어 있고, 여러 지방의 예산 요청액은 국가 예산 총액을 넘어설 수도 있다. 

그렇기에 여러 지방의 예산 요청액을 최대한 충족하는 선에서, 국가예산 총액을 최대한 써야 한다(상한가 지정).

  2. 상한가 지정은 Binary Search 로 진행을 한다.  

 

<주의사항>

  1. Binary Search 진행 시에 low, mid, high 관계를 잘 파악해야 한다. 정답이 100이라면, 101 또는 99로 정답이 나와 마지막에서 헤매는 경우가 매우 많다. 

    가령 예를 들어 보자. 

우리는 정답 4를 원하는 상황인데,

                                    low         mid          high 

                                       3                                 4

인 상황에서는 mid가 3만 나와서 이것만으로는 결괏값을 도출하기 어렵다.

따라서! low = mid + 1; 을 해주어야 한다

또한 while(high >= low)문을 벗어나기 위해서는 low가 high보다 높아야 하는데, 그 경우 결괏값을 한시적으로 저장해 줄 수 있는

int result = mid; 

를 두어 정답값을 보존한다. 

 

이분탐색이 항상 -1, 1 차이로 정답을 맞추지 못하는 경우가 많았는데, 이번 문제를 기점으로 조금 더 정교하게 풀 수 있을 것 같다.

   

<코드>

#include <iostream>
#include <vector> 
#include <algorithm>
using namespace std;

int N; // 지방의 수 
int RequestMoney[10001]; // 각 지방별 예산요청액 
int high = 0; //상한액 

int main(){
    cin >> N;
    for (int i=0; i<N; i++){
        cin >>RequestMoney[i];
        if (high < RequestMoney[i]) high = RequestMoney[i];
    }
    long long SumRequest; // 국가에서 정해진 총 예산
    long long sum = 0; // 임시 상한가(mid) 지정 시 계산되는 예산 
    cin >> SumRequest;

    int low = 0;
    int mid, result ;

    while(high >= low ){
        mid = (high + low ) / 2 ;    
        sum = 0;
        
        for (int i=0; i< N; i++){
            sum += min(RequestMoney[i], mid);
        }

        if (sum <=SumRequest){ // 예산액을 초과하지 않는 경우(넉넉할 떄 )
            low = mid+1;
            result = mid;
        }
        else // 예산액을 초과하는 경우 
            high = mid-1;
     
    }

    cout << result; 


}
반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 1707 - 이분 그래프  (1) 2023.08.06
[C++] 백준 4963 - 섬의 개수  (0) 2023.08.06
[C++] 백준 1260 - DFS와 BFS  (0) 2023.08.06
[C++] 백준 1021- 회전하는 큐  (0) 2023.08.05
[C++] 백준 1012 - 유기농 배추  (0) 2023.08.05
'알고리즘 문제풀이/백준' 카테고리의 다른 글
  • [C++] 백준 4963 - 섬의 개수
  • [C++] 백준 1260 - DFS와 BFS
  • [C++] 백준 1021- 회전하는 큐
  • [C++] 백준 1012 - 유기농 배추
jiminai
jiminai
안녕하세요, 고려대학교 컴퓨터학과 학부생의 컴퓨터 공부 기록입니다👻
    반응형
  • jiminai
    컴퓨터 공부 Blog
    jiminai
  • 전체
    오늘
    어제
    • 분류 전체보기 (32)
      • AI Paper Review (9)
        • MLLMs (4)
        • Reinforcement Learning (2)
        • NLP (3)
      • 알고리즘 문제풀이 (18)
        • 백준 (17)
        • 프로그래머스 (1)
        • 알고리즘 이론 공부 (0)
      • AI 개념 정리 (2)
        • Pytorch 공부 (1)
      • Web Development (1)
      • 대외활동&프로젝트&대회 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 프로필
    • Github
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    13975
    BFS
    백준
    fasttext
    냅색문제
    벡준
    다이나믹프로그래밍
    누적합
    HACKUTHON 2023
    Dikjstra
    이분탐색
    dfs
    2467
    투포인터
    2056
    두 배열의 합
    개발
    가장긴증가하는부분수열
    DP
    11000
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jiminai
[C++] 백준 2512 - 예산
상단으로

티스토리툴바