택시짱의 개발 노트

[프로그래머스] 최고의 집합 본문

알고리즘

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

택시짱 2020. 3. 19. 15:10

링크

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

집합의 원소의 개수 n과 모든 원소들의 합 s가 매개변수로 주어질 때, 최고의 집합을 구해야 되는 문제 이다.

 

예를 들어 원소의 개수가 2개 이고 원소들의 합이 6이라고 할 때 원소를 나누어 보았을 때

1,5  2,4  3,3  이렇게 3개로 나눌 수 있고 각각 원소의 곱은 5, 8 ,9이다.

 

이때 원소의 합을 원소의 개수로 나누었을 때 나오는 값에 가까운 수가 많을수록 원소들의 곱이 가장 크다는 것을 알 수 있다. 

 

하지만 원소들의 합이 원소의 개수로 나누어 떨어지지 않을 때는 예를 들어 원소의 개수가 3개 이고 합이 11과 같은 경우에는 3,3,3으로 나누고 나머지가 2 이기 때문에 3, 4 ,4로 만들어 주면 최대의 곱을 만들 수 있습니다.

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string>
#include<set>
#include<map>
#include<cstring>
#include<functional>
#include<cmath>
#include<stack>

#define SIZE 1010
const int INF = 2000000000;

using namespace std;

typedef long long int ll;
vector<int> solution(int n, int s) {
	int mok = s / n;
	int na = s %n;
	vector<int> answer;

	if (mok == 0) {
		answer.push_back(-1);
		return answer;
	}
    
	for (int i = n-1; i >=0; i--) {
    	//나머지가 있으면 원소에 1을 더해줌
		if (i < na)
			answer.push_back(mok + 1);
		else
			answer.push_back(mok);

	}
	return answer;
}
반응형
Comments