코딩 테스트 문제

최고의 집합

HyungSunKim 2022. 11. 3. 17:23

문제의 핵심은 

자연수 n개로 이루어진 집합 중 곱이 가장 높은걸 구해야 하는 문제이다.

예시로 보듯이 9가 있다면 집합중에 {1,8} , {2,7}, {3,6}, {4,5}가 있지만

이것들 중의 곱이 가장 큰 집합은 {4,5}이다.

두 자연수중에 한쪽만 너무 큰 것보다 두 개의 자연수의 차이가 별 로안나야 가장 큰 수가 나온다.

 

그렇다면 균등하게 큰수를 알아오기 위해서는

집합의 원소 개수인 n과 모든 원소들의 합 s를 나누게 되면 균등하게 큰 수들이 나온다.

9/2를 한다면 몫은 4가나오고 나머지는 1 값이 나오게 된다.

그렇다는 것은 4 + 4 + 1 == 4 + 5가 집합의 곱이 가장 큰 집합이 된다.

 

따라서 s% n이 딱 나누어 떨어진다면 그 몫이 n개만큼 들어간 집합이 가장 큰 집합이 되고

딱 나누어 떨어지지 않는다면 나머지들을 1로 쪼개어 집합에 제일 오른쪽부터 1씩 넣어주면 된다.

 

 

다른 예를 들면

라고 했을 때 최고의 집합을 구하기 위해서는

4는  1+ 1+ 1+ 1과 같기 때문에

맨 오른쪽부터 6에다 1을 더해준다.

그러면 {6,7,7,7,7}이 자연수 n개로 이루어진 집합 중 곱이 가장 큰 집합이 된다.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n, int s) 
{
    std::vector<int> answer;
    
    if(n > s)
    {
        //최고의 집합을 구할 수 없을떄
        answer.push_back(-1);
    }
    else
    {
        //딱나누어 떨어질 경우
        int Quotient  = s/n;    //몫
        int Remainder = s%n;    //나머지
        for(int i = 0; i < n ; i++)
        {
            answer.push_back(Quotient);
        }
        
        //만약 나머지가 있을경우
        if(Remainder != 0)
        {
            for(int k = n-1; Remainder > 0; k-- )
            {
                answer[k]++;
                Remainder--;
            }
        }
    }
    
    return answer;
}