프로그래머스 - 최고의집합 (java)

Mendel·2024년 3월 20일

알고리즘

목록 보기
34/85

https://school.programmers.co.kr/learn/courses/30/lessons/12938

문제 접근

원소들의 합이 n인 중복 집합들 중에서 곱이 최대가 되기 위해서는, 집합 내 숫자들 간의 표준편차가 가장 적어야 한다는 것을 의미한다.

이게 받아들여지지 않는다면, 미적분에서도 극대값과 극솟값은 항상 값들이 고르게 분포되어있거나, 특수한 상황이라는 것을 잘 떠올려본다면 위의 말을 쉽게 납득 가능할 것이다.

따라서, 우선 원소들의 총합인 s를 원소의 갯수 n으로 나눈 몫값을 모든 원소에 할당한다. 그 다음 나머지를 하나씩 뿌려주면 된다. 예를 들어 합 11을 이루고 원소의 갯수가 3개인 최고의 집합을 찾는 방법은 다음과 같다. 우선 원소 3개에 모두 3씩 주고, 남은 2를 1씩 총 두 원소에게 할당해주면 된다.
[3,4,4]

단, 문제에서 오름차순으로 정렬하라고 했기 때문에, 나머지 값을 할당할때 뒤에 있는 원소들부터 1씩 더 주면 된다.

문제 풀이

class Solution {
    public int[] solution(int n, int s) {
        int[] answer = new int[n];
        if (n > s) return new int[] {-1};
        int initValue = s / n;
        int remain = s % n;
        for(int i = 0; i<n; i++){
            if (i >= n - remain) {
                answer[i] = initValue + 1;
            } else {
                answer[i] = initValue;                
            }
        }
        
        return answer;
    }
}

profile
이것저것(안드로이드, 백엔드, AI, 인프라 등) 공부합니다

0개의 댓글