[프로그래머스 C++] 최고의 집합

 

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

 


 

 

해결전략

 

수학?

 

중복을 허용하는 집합에서 곱이 최대가 되어야 한다.

숫자의 크기 차이가 작을수록 곱은 최대가 된다.

 

그래서 s / n 으로 몫을 구하여 중간값을 기준으로 집합을 만든다.

 

s % n 으로 나머지를 구하고 나머지 값 만큼 숫자를 더한다.


 

정답코드

 

#include <vector>
using namespace std;

vector<int> solution(int n, int s) {
    vector<int> answer; 

    int value = s / n;  	// s를 n으로 나눈 몫
    int remainder = s % n;  // s를 n으로 나눈 나머지
    int x = n - remainder;  // n에서 나머지를 뺀 값

    if (value < 1) // value가 1보다 작으면 -1을 반환하고 종료
    {
        answer.push_back(-1);
        return answer;
    }

    for (int i = 1; i <= n; i++)
    {
        if (i > x) {  // i가 x보다 크면 value + 1을 추가
            answer.push_back(value + 1);
        }
        else { // i가 x보다 작거나 같으면 value를 추가
            answer.push_back(value);
        }
    }

    return answer;
}