Problem Solving/BOJ

[백준 15663번] [Backtracking / Map] N과 M (10)

  • -
728x90
반응형

Approach

기본적인 접근 방법은 다음 문제와 비슷하다. https://viyoung.tistory.com/286

 

[백준 15663번] [Backtracking / Map] N과 M (9)

Approach 같은 숫자가 여러 개 들어갈 수 있음에도 불구하고, 중복되는 수열을 여러 번 출력하면 안되는 것이 이 문제의 가장 핵심이다. 이전 문제의 경우 단순히 해당 index 이후부터 고려하거나 처

viyoung.tistory.com

다만, 비내림차순이라는 조건때문에 함수 내부의 반복문에서 자신의 index 이상부터만 고려해준다는 점에서 차이점이 존재한다.

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;
map<int, int> cap;
int result[8];
vector<int> s;
vector<vector<int> > output;
int n, m;

void solve(int index, int cur)
{
    result[cur++] = s[index];
    cap[s[index]] -= 1;
    if (cur == m)
    {
        vector<int> temp;
        for (int i = 0; i < m; i++)
        {
            temp.push_back(result[i]);
        }
        output.push_back(temp);
    }
    else
    {
        for (int i = index; i < s.size(); i++)
        {
            if (cap[s[i]] > 0)
            {
                solve(i, cur);
            }
        }
    }
    cap[s[index]] += 1;

    return;
}

int main(void)
{
    fastio;
    cin >> n >> m;

    for (int i = 0; i < n; i++)
    {
        int t;
        cin >> t;
        cap[t] += 1;
        s.push_back(t);
    }

    sort(s.begin(), s.end());
    s.erase(unique(s.begin(), s.end()), s.end()); // 중복 제거

    for (int i = 0; i < n; i++)
    {
        solve(i, 0);
    }
    sort(output.begin(), output.end());
    output.erase(unique(output.begin(), output.end()), output.end());
    for (int i = 0; i < output.size(); i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << output[i][j] << " ";
        }
        cout << "\n";
    }
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.