Make Unreal REAL.
article thumbnail
Level 3. 최고의 집합

 

 

재귀를 이용해 합이 s가 되는 모든 n개의 조합을 구해 계산하는 방법이다.

  • 나를 제외한 나머지에 해당하는 조합을 구한 후 나를 앞에 붙이는 방식이므로, vector보다는 deque을 사용했다.

 

하지만, 시간 초과가 발생했다.

 

// 이 풀이는 시간 초과가 발생한다.
#include <iostream>
#include <vector>
#include <deque>

using namespace std;

deque<deque<int>> get_sum_sets(int num, int n, int sum)
{
    if (n == 1 && num <= sum)
        return {{sum}};

    deque<deque<int>> result;

    for (int i = num; i <= sum - n + 1; ++i)
    {
        for (deque<int>& deq : get_sum_sets(i, n - 1, sum - i))
        {
            deq.emplace_front(i);

            result.emplace_back(deq);
        }
    }

    return result;
}

vector<int> solution(int n, int s)
{
    int max = -1;
    vector<int> answer {-1};

    for (deque<int>& deq : get_sum_sets(1, n, s))
    {
        int mul = 1;

        for (int e : deq)
            mul *= e;

        if (max <= mul)
            answer = vector<int>(deq.begin(), deq.end());
    }

    return answer;
}

 

재귀로 시간 초과가 발생했다면, 접근 방법 자체를 바꿔야 한다는 뜻이다.

 

생각해보니 평균을 이용하면 될 것 같았고 while문을 사용해 재귀적인(?) 방법으로 해결했다.

  • 아래 방법은 정렬하지 않아도 오름차순으로 배치된다.

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> solution(int n, int s)
{
    if (n > s)
        return {-1};

    vector<int> answer;

    while (0 < n)
    {
        int num = s / n--;

        s -= num;

        answer.emplace_back(num);
    }

    return answer;
}

 

모든 원소는 평균 or 평균 + 1임을 증명해서 반복문을 전혀 사용하지 않고 바로 해결한 사람도 있었다..

 

#include <iostream>
#include <vector>

using namespace std;

vector<int> solution(int n, int s)
{
    if (n > s)
        return {-1};

    int avg = s / n, mod = s % n;
    vector<int> left(n - mod, avg), right(mod, avg + 1);

    left.insert(left.end(), right.begin(), right.end());

    return left;
}

'자료구조 & 알고리즘 > 프로그래머스' 카테고리의 다른 글

Level 2. 테이블 해시 함수  (0) 2023.07.19
Level 3. 등굣길  (0) 2023.07.18
Level 3. 네트워크  (0) 2023.07.16
Level 3. 단어 변환  (0) 2023.07.15
Level 3. 베스트앨범  (0) 2023.07.14
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그