[데일리코딩] 21번

박채은·2022년 12월 17일
0

코딩테스트

목록 보기
10/52

문제

[코플릿 - largestProductOfThree]


코드

public class Solution {
    public static int largestProductOfThree(int[] arr) {
        int max1=0;
        int max2= 0;
        int len = arr.length;
        Arrays.sort(arr);
        max1 = arr[len-1] * arr[len-2] * arr[len-3];
        max2 = arr[len-1] * arr[0] * arr[1];

        return Math.max(max1,max2);
    }

    public static void main(String[] args) {
        int output = largestProductOfThree(new int[]{2, 1, 3, 7});
        System.out.println(output); // --> 42 (= 2 * 3 * 7)

        output = largestProductOfThree(new int[]{-1, 2, -5, 7});
        System.out.println(output); // --> 35 (= -1 * -5 * 7)
    }
}

풀이

배열은 음수, 0, 양수가 섞여서 존재할 수 있다.
따라서 경우의 수는,

  1. 모두 양수인 경우 (0 포함)
  2. 모두 음수인 경우 (0 포함)
  3. 음수/양수/0이 섞인 경우

로 나눌 수 있다.

우선 오름차순으로 배열을 정렬한 후, max 값을 구한다.

1) 가장 큰 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]

2) 가장 작은 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]

3-1) 모두 양수인 가장 큰 3개의 값을 곱한다.
-> arr[len-1] * arr[len-2] * arr[len-3]

3-2) 양수 중 가장 큰 값과 음수 중 가장 작은 값 2개를 곱한다.
-> arr[len-1] * arr[0] * arr[1]

(3)의 경우에는, 두 경우 중 더 큰 값이 max 값이 된다.


(1), (2), (3)의 경우를 일반화해서 작성하면, 다음과 같다.

max1 = arr[len-1] * arr[len-2] * arr[len-3];
max2 = arr[len-1] * arr[0] * arr[1];

return Math.max(max1,max2);

0개의 댓글