ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Algo RhythmπŸ•ΊπŸ’ƒ] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 고득점 kit μ˜ˆμ‚°
    Algo RhythmπŸ•ΊπŸ’ƒ/Programmers 2020. 7. 30. 15:38

    πŸ“š 문제 μ„€λͺ…

    κ΅­κ°€μ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” μ—¬λŸ¬ μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ„ μ‹¬μ‚¬ν•˜μ—¬ κ΅­κ°€μ˜ μ˜ˆμ‚°μ„ λΆ„λ°°ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. κ΅­κ°€μ˜ˆμ‚°μ˜ 총앑은 미리 μ •ν•΄μ Έ μžˆμ–΄μ„œ λͺ¨λ“  μ˜ˆμ‚°μš”μ²­μ„ λ°°μ •ν•΄ μ£ΌκΈ°λŠ” μ–΄λ €μšΈ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 정해진 총앑 μ΄ν•˜μ—μ„œ κ°€λŠ₯ν•œ ν•œ μ΅œλŒ€μ˜ μ΄ μ˜ˆμ‚°μ„ λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ λ°°μ •ν•©λ‹ˆλ‹€.

     

    1. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μžˆλŠ” κ²½μš°μ—λŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•©λ‹ˆλ‹€.
    2. λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ—λŠ” νŠΉμ •ν•œ μ •μˆ˜ μƒν•œμ•‘μ„ κ³„μ‚°ν•˜μ—¬ κ·Έ 이상인 μ˜ˆμ‚°μš”μ²­μ—λŠ” λͺ¨λ‘ μƒν•œμ•‘μ„ λ°°μ •ν•©λ‹ˆλ‹€. μƒν•œμ•‘ μ΄ν•˜μ˜ μ˜ˆμ‚°μš”μ²­μ— λŒ€ν•΄μ„œλŠ” μš”μ²­ν•œ κΈˆμ•‘μ„ κ·ΈλŒ€λ‘œ λ°°μ •ν•©λ‹ˆλ‹€.

     

    예λ₯Ό λ“€μ–΄, 전체 κ΅­κ°€μ˜ˆμ‚°μ΄ 485이고 4개 μ§€λ°©μ˜ μ˜ˆμ‚°μš”μ²­μ΄ 각각 120, 110, 140, 150일 λ•Œ, μƒν•œμ•‘μ„ 127둜 작으면 μœ„μ˜ μš”μ²­λ“€μ— λŒ€ν•΄μ„œ 각각 120, 110, 127, 127을 λ°°μ •ν•˜κ³  κ·Έ 합이 484둜 κ°€λŠ₯ν•œ μ΅œλŒ€κ°€ λ©λ‹ˆλ‹€.

    각 μ§€λ°©μ—μ„œ μš”μ²­ν•˜λŠ” μ˜ˆμ‚°μ΄ λ‹΄κΈ΄ λ°°μ—΄ budgetsκ³Ό 총 μ˜ˆμ‚° M이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μœ„μ˜ 쑰건을 λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ” μƒν•œμ•‘μ„ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄μ£Όμ„Έμš”.

     

    μ œν•œ 사항

    • μ§€λ°©μ˜ μˆ˜λŠ” 3 이상 100,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

    • 각 μ§€λ°©μ—μ„œ μš”μ²­ν•˜λŠ” μ˜ˆμ‚°μ€ 1 이상 100,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

    • 총 μ˜ˆμ‚°μ€ μ§€λ°©μ˜ 수 μ΄μƒ 1,000,000,000 μ΄ν•˜μΈ μžμ—°μˆ˜μž…λ‹ˆλ‹€.

     

    🎯 μ–΄λ–»κ²Œ ν’€μ—ˆλ‚˜

    첫번째 μ‹œλ„ (70/ 100)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] budgets, int M) {
            int answer = 0;
            int n = budgets.length;
            int max = Arrays.stream(budgets).max().getAsInt();
            int min = Arrays.stream(budgets).min().getAsInt();
            int lower = M / n, upper = max;
            int rem = M % n;
            
            if(Arrays.stream(budgets).sum() <= M) {
                answer = max;
            }
            else {
                while(lower < upper) {
                    int mid = (lower + upper) / 2;
                    int total = getTotal(budgets, mid);
                    
                    // System.out.println("Lower : " + lower);
                    // System.out.println("Upper : " + upper);
                    // System.out.println("mid : " + mid);
                    // System.out.println("total : " + total);
                    // System.out.println("M - total : " + (M - total));
                    // System.out.println();
                    
                    
                    if(M - total == rem) {
                        answer = mid;
                        break;
                    }
                    
                    if(M - total > rem) {
                        lower = mid + 1;
                        continue;
                    }
                    
                    if(M - total < rem) {
                        upper = mid;
                        continue;
                    }
                }
            }
            
            return answer;
        }
        
        public int getTotal(int[] budgets, int limit) {
            int total = 0;
            for(int i = 0; i < budgets.length; i++) {
                total += (budgets[i] > limit) ? limit : budgets[i];
            }
            return total;
        } 
    }

     

    λ‘λ²ˆμ§Έ μ‹œλ„ (95/ 100)

    import java.util.Arrays;
    
    class Solution {
        public int solution(int[] budgets, int M) {
            int answer = 0;
            int n = budgets.length;
            int max = Arrays.stream(budgets).max().getAsInt();
            int lower = M / n, upper = max;
            
            if(Arrays.stream(budgets).sum() <= M) {
                answer = max;
            }
            else {            
                while(lower <= upper) {
                    int mid = lower + (upper - lower) / 2;
                    int total = getTotal(budgets, mid);
                    
                    // System.out.println("Lower : " + lower);
                    // System.out.println("Upper : " + upper);
                    // System.out.println("mid : " + mid);
                    // System.out.println("total : " + total);
                    // System.out.println("M - total : " + (M - total));
                    // System.out.println();
                    
                    if(M - total > 0) { // 늘렀
                        answer = (answer < mid) ? mid : answer;
                        lower = mid + 1;
                        continue;
                    }
                    
                    if(M - total < 0) { // 쀄여
                        upper = mid - 1;
                        continue;
                    }
                }
            }
            
            return answer;
        }
        
        public int getTotal(int[] budgets, int limit) {
            int total = 0;
            for(int i = 0; i < budgets.length; i++) {
                total += (budgets[i] > limit) ? limit : budgets[i];
            }
            return total;
        } 
    }

     

    μ΅œμ’… μ½”λ“œ

    class Solution {
        public int solution(int[] budgets, int M) {
            int answer = 0;
            int n = budgets.length;
            long sum = 0;
            int max = Integer.MIN_VALUE;
            
            for(int i = 0; i < n; i++) {
                max = (max > budgets[i]) ? max : budgets[i];
                sum += budgets[i];
            }
    
            int lower = M / n, upper = max;
            
            if(sum <= M) {
                answer = max;
            }
            else {      
                while(lower <= upper) {
                    int mid = lower + (upper - lower) / 2;
                    
                    if(isCapable(budgets, mid, M)) {
                        answer = (answer < mid) ? mid : answer; // μƒν•œκ°€ = κ°€λŠ₯ν•œ μ˜ˆμ‚° 쀑 μ΅œλŒ€
                        lower = mid + 1;
                        continue;
                    }
                    else {
                        upper = mid - 1;
                        continue;
                    }
                }
            }
            
            return answer;
        }
        
        public boolean isCapable(int[] budgets, int limit, int M) {
            long total = 0;
            for(int i = 0; i < budgets.length; i++) {
                total += (budgets[i] > limit) ? limit : budgets[i];
            }
            return (M > total);
        } 
    }

     

    🧐 μ™œ μ €λ ‡κ²Œ ν’€μ—ˆλ‚˜

    첫번째 μ‹œλ„ (70/ 100)

     

    μ²˜μŒμ—λŠ” μœ„μ™€ 같이 λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μžˆλŠ” κ²½μš°μ—λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚° μš”μ²­μ•‘ 쀑 κ°€μž₯ 큰 μ•‘μˆ˜λ₯Ό μƒν•œκ°€λ‘œ ν•˜κ³ 

    λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ—λŠ” 총 μ˜ˆμ‚°μ—μ„œ μƒν•œκ°€μ— 따라 κ²°μ •λ˜λŠ” 각 지방 μ˜ˆμ‚°λ“€μ˜ 총합을 λΊ€ κ°’κ³Ό 총 μ˜ˆμ‚°μ„ μ§€λ°©μ˜ 수둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€κ°€ κ°™μ•„μ•Ό ν•œλ‹€κ³  μƒκ°ν–ˆλ‹€. (νŠΉλ³„ν•œ μ΄μœ λŠ” μ—†μ—ˆλ‹€. κ·Έλƒ₯ μ–΄λ–€ μˆ¨κ²¨μ§„ 법칙을 λ°œκ²¬ν•œ 쀄 μ•Œμ•˜λ‹€.🀣)

     

    그리고 μƒκ°ν•΄λ³΄λ‹ˆ λͺ¨λ“  μš”μ²­μ΄ 배정될 수 μ—†λŠ” κ²½μš°μ— μƒν•œκ°€μ˜ μ΅œμ†Œκ°’μ€ 총 μ˜ˆμ‚°μ„ 각 지방에 따라 κ· λ“±ν•˜κ²Œ λ‚˜λˆˆ κ°’μ΄λΌλŠ” 것을 μ•Œ 수 μžˆμ–΄μ„œ μƒν•œκ°€μ˜ μ΅œμ†Œκ°’μ„ M / n, μ΅œλŒ€κ°’μ„ max둜 두고 binary searchλ₯Ό 톡해 찾아가도둝 ν–ˆλ‹€.

     

    λ‘λ²ˆμ§Έ μ‹œλ„ (95/ 100)

    μƒκ°ν•΄λ³΄λ‹ˆ 총 μ˜ˆμ‚°μ΄ μƒν•œκ°€μ— 따라 κ²°μ •λ˜λŠ” 각 지방 μ˜ˆμ‚°λ“€μ˜ 총합보닀 큰 경우 즉, λ°°μ • κ°€λŠ₯ν•œ κ²½μš°μ— μƒν•œκ°€λŠ” κ°€λŠ₯ν•œ μ˜ˆμ‚° 쀑 μ΅œλŒ€κ°’μ΄λ©΄ λœλ‹€λŠ” 것을 μ•Œ 수 μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ νš¨μœ¨μ„±μ΄ λ¬Έμ œμ˜€λ‹€.

     

     

    μ΅œμ’… μ½”λ“œ

    μ•Œκ³ λ¦¬μ¦˜ μžμ²΄λŠ” λ¬Έμ œκ°€ μ—†μ–΄μ„œ λ‹΅λ‹΅ν–ˆλ‹€. κ·Έλž˜μ„œ μ§ˆλ¬Έν•˜κΈ°λ₯Ό λ³΄λ‹ˆ λ¬Έμ œλŠ” μƒν•œκ°€μ— 따라 λ°°μ •λ˜λŠ” 각 μ§€λ°©μ˜ μ˜ˆμ‚° 총합을 int둜 ν‘œν˜„ν•˜λ©΄ overflowκ°€ λ°œμƒν•΄μ„œ κ·Έλ ‡λ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€. Long으둜 μˆ˜μ •ν•˜λ‹ˆ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

     

    πŸ“– 무엇을 λ°°μ› λ‚˜

    ν™•μ‹€ν•˜μ§€ μ•ŠμœΌλ©΄ μ’€ 더 μƒκ°ν•˜λŠ” μŠ΅κ΄€μ„ κ°€μ§€μž!

    λŒ“κΈ€

Designed by Tistory.