ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 가장 큰 곱 만들기 문제
    algorithm 2018. 7. 26. 15:11
    반응형

    문제


    주어진 정수 배열 number에는 50개 미만의 1보다 크고 1000보다 작은 정수가 주어져 있다. 이 중 단 하나의 숫자에 +1 하여 전체 숫자의 곱을 가장 크게 만든 뒤 그 곱을 리턴하라.



    입력예시


    numbers = {1, 2, 3}

    return : 12


    numbers = {1, 3, 2, 1, 1, 3}

    return : 36



    풀이


    가장 쉽게 떠올릴 수 있는 풀이는 먼저 배열의 모든 원소의 곱을 구한 뒤, 전체 배열을 순회하며 그 배열의 숫자를 나눈뒤 다시 1을 더한 숫자로 곱해 보며 최대값을 찾는 것이다. 시간 복잡도는 O(N)으로 매우 짧지만 이 문제는 약간의 수학적 센스를 발휘하면 조금 더 쉬워진다. 


    +1 을 하여 전체의 곱을 가장 크게 만드는 숫자는 배열에서 가장 작은 숫자이다. 어떤 숫자 n을 +1 할때 전체 곱의 변화는 항상 (n+1)/n 이기 때문에 n값이 작을 수록 더 큰 변화가 생긴다. 이 아이디어를 가지고 짠 코드는 역시 O(N)이지만 위의 아이디어보다 반복문을 한 번 덜 돈다. 코드는 다음과 같다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public long maxProd(int[] numbers) {
            
            long ret = 1;
            int min = numbers[0];
            
            for (int n : numbers) {
                ret *= n;
                if (min > n) min = n;
            }
            
            ret /= min;
            ret *= min+1;
            
            return ret;
        }
    cs


    반응형

    'algorithm' 카테고리의 다른 글

    악수 문제(카달란 수)  (0) 2018.07.31
    기부금 최대값 찾기  (0) 2018.07.30
    배낭 문제(냅색 문제)  (0) 2018.07.29
    가장 먼 출구 찾기 (너비우선탐색)  (0) 2018.07.27
    가장 많은 취미 찾기  (0) 2018.07.26
Designed by Tistory.