Skip to content

Latest commit

ย 

History

History
116 lines (101 loc) ยท 2.99 KB

File metadata and controls

116 lines (101 loc) ยท 2.99 KB

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค Level3 : ์˜ˆ์‚ฐ

์ด๋ถ„ ํƒ์ƒ‰ binary search

  • ์ด๋ถ„ํƒ์ƒ‰์˜ ์กฐ๊ฑด : ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ์ด ๋˜์–ด์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ๊ฐ’์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•
  • max~min์˜ ์ค‘๊ฐ„๊ฐ’mid ์„ ์ƒํ•œ์„ ์œผ๋กœ ์ •ํ•ด์„œ ์˜ˆ์‚ฐ์„ ๊ณ„์‚ฐ
  • ์˜ˆ์‚ฐ์„ ๋„˜์ง€์•Š์•˜๋‹ค๋ฉด : mid~max ์‚ฌ์ด๋กœ ๋ฒ”์œ„๋ฅผ ์ƒˆ๋กœ ์กฐ์ •
  • ์˜ˆ์‚ฐ์„ ๋„˜์—ˆ๋‹ค๋ฉด : min~mid ์‚ฌ์ด๋กœ ๋ฒ”์œ„๋ฅผ ์ƒˆ๋กœ ์กฐ์ •
  • ์ตœ์†Œ๊ฐ’๊ณผ ์ตœ๋Œ€๊ฐ’์ด ๊ฐ™์•„์งˆ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต
class Solution {
    public int solution(int[] budgets, int M) {
        int min = 0;
        int max = 0;
        for(int b: budgets){
            if(b>max) max = b;
        }
        int answer = 0;

        while(min <= max){
            int mid = (min+max)/2;

            int sum = 0;
            for(int b:budgets){
                if(b > mid){
                    sum += mid;
                } else {
                    sum += b;
                }
            }
            if(sum<=M){
                min = mid + 1;
                answer = mid;
            } else {
                max = mid - 1 ;
            }
        }
        return answer;
    }
}

Stream์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง

import java.util.stream.*;
class Solution {
    public int solution(int[] budgets, int M) {
        int min = 0;
        int max = IntStream.of(budgets).max().orElse(0);
        //IntStream.of(budgets).max() => ๋ฆฌํ„ดํƒ€์ž… : Optional(Int) : ๊ฐ’์ด ์—†์„ ์ˆ˜๋„ ์žˆ์Œ
        //.orElse(0) => ๊ฐ’์ด ์—†์„ ๊ฒฝ์šฐ 0 
        
        int answer = 0;

        while(min <= max){
            final int mid = (min+max)/2; // Stream์•ˆ์—์„œ ๊ฐ€๋ณ€๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉX-> final int
            int sum = IntStream.of(budgets)
            .map(b -> Math.min(b,mid))
            .sum();

            if(sum<=M){
                min = mid + 1;
                answer = mid;
            } else {
                max = mid - 1 ;
            }
        }
        return answer;
    }
}

๋ณด์™„ ํ•„์š” ...

import java.util.*;
class Solution {
    int calBudget(int[] budgets, int limit){
        int total = 0;
        for(int b : budgets){
            total += (b>limit)? limit : b;
        }
        return total;
    }
    int findLimit(int[] budgets, int M, int min, int max){
        int mid = (max+min)/2;
        int calB = calBudget(budgets,mid);
        if(min>max){
            return max;
        }
        if(calB>=M){
            max = findLimit(budgets,M,min,mid-1);
        } else{
            max = findLimit(budgets,M,mid+1,max);
        }
        return max;
    }
    
    public int solution(int[] budgets, int M) {
        Arrays.sort(budgets);
        int maxB = budgets[budgets.length-1];
        int minB = budgets[0];
        
        // ์˜ˆ์‚ฐ์š”์ฒญ์ด ์ „๋ถ€ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ 
        if(calBudget(budgets,maxB)<=M) return maxB;

        // ์ƒํ•œ์„ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ 
        int answer = findLimit(budgets, M, minB, maxB);
        return answer;
    }
}