코딍코딍
코딩기록
코딍코딍
전체 방문자
오늘
어제
  • 분류 전체보기 (271)
    • 개발 (2)
    • Java (1)
    • 스프링 (28)
    • JPA (11)
    • Git (3)
    • 알고리즘 (160)
      • 백준 (132)
      • 프로그래머스 (8)
      • SWEA (20)
    • 토이 프로젝트 (14)
      • 간단한 Springboot CRUD (1)
      • 게시판 프로젝트 (13)
    • 알고리즘 개념정리 (8)
    • 오류 해결 (13)
    • 보류 (0)
    • AWS (5)
    • 트러블 슈팅 (0)
    • 회고 (3)
    • CS (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

최근 글

티스토리

hELLO · Designed By 정상우.
코딍코딍

코딩기록

알고리즘/백준

2512번 : 예산

2022. 8. 3. 15:59

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

 

2512번: 예산

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

www.acmicpc.net

 

 

문제

 

 

코드

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int arr[] = new int[n];
        for(int i=0;i<n;i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int m = Integer.parseInt(br.readLine());

        int moneyMax=0;
        int result=0;
        int start = 0, end = Arrays.stream(arr).max().getAsInt();
        //가능한 총 예산을 기준으로 이진탐색 수행
        while(start<=end) {
            int mid = (start+end)/2; //상한액
            int money=0; //가능한 총 예산
            
            //총 예산 계산
            for(int i=0;i<n;i++) {
                if(arr[i]>mid) money+=mid;
                else money+=arr[i];
            }
            
            //총 예산을 넘지않는 가능한 최대 예산이면
            if(money<=m && moneyMax<money){ 
                moneyMax = money; //예산 기록
                result=mid; //상한액 기록
            }

            if(money<m) start=mid+1; //상한액 늘려서 총 예산액 늘리기
            else if(money>m) end = mid-1; //상한액 줄여서 총 예산액 줄이기
            else break;
        }
        System.out.println(result);
    }
}

 

 

해결방법

가능한 총 예산액을 기준으로 이진 탐색을 수행하여 문제를 해결하였다.
상한액을 가지고 총 예산을 계산해 입력받은 총 예산을 넘지않는 가능한 최대 예산이면 기록을 하였다. 

그리고 계산된 총 예산(money)이 입력받은 총 예산(m)보다 작으면 총 예산을 늘리기위해 상한액을 늘렸고 
계산된 총 예산이 입력받은 총 예산보다 크면 총 예산을 줄이기위해 상한액을 줄였다.

'알고리즘 > 백준' 카테고리의 다른 글

2865번 : 나는 위대한 슈퍼스타K  (0) 2022.08.05
1012번 : 유기농 배추  (0) 2022.08.04
2805번 : 나무 자르기  (0) 2022.08.02
2667번 : 단지번호붙이기  (0) 2022.08.01
2178번 : 미로 탐색  (0) 2022.07.31
    '알고리즘/백준' 카테고리의 다른 글
    • 2865번 : 나는 위대한 슈퍼스타K
    • 1012번 : 유기농 배추
    • 2805번 : 나무 자르기
    • 2667번 : 단지번호붙이기
    코딍코딍
    코딍코딍
    ㅎ2

    티스토리툴바