반응형

문제 링크

 

문제집: N과 M (baekjoon)

 

www.acmicpc.net

 

문제를 홀수, 짝수로 나누어 홀수 문제는 순서가 있고, 짝수 문제는 순서가 없다(정렬).

 

1. 15649

#include <iostream>
#include <vector>

using namespace std;

int n, m;

void rec(vector<int> v, vector<bool> visited, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = 1; i <= n; ++i){
        if(visited[i])
            continue;
        visited[i] = true;
        v.push_back(i);
        rec(v, visited, cnt+1);
        visited[i] = false;
        v.pop_back();
    }
}

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

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, visited, 0);
}

 

2. 15650

#include <iostream>
#include <vector>

using namespace std;

int n, m;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = pos; i <= n; ++i){
        v.push_back(i);
        rec(v, i+1, cnt+1);
        v.pop_back();
    }
}

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

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, 1, 0);
}

 

3. 15651

#include <iostream>
#include <vector>

using namespace std;

int n, m;

void rec(vector<int> v, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = 1; i <= n; ++i){
        v.push_back(i);
        rec(v, cnt+1);
        v.pop_back();
    }
}

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

    vector<int> v;
    rec(v, 0);
}

 

4. 15652

#include <iostream>
#include <vector>

using namespace std;

int n, m;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = pos; i <= n; ++i){
        v.push_back(i);
        rec(v, i, cnt+1);
        v.pop_back();
    }
}

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

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, 1, 0);
}

 

5. 15654

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;

void rec(vector<int> v, vector<bool> visited, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = 0; i < n; ++i){
        if(visited[i])
            continue;
        visited[i] = true;
        v.push_back(input[i]);
        rec(v, visited, cnt+1);
        visited[i] = false;
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, visited, 0);
}

 

6. 15655

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = pos; i < n; ++i){
        v.push_back(input[i]);
        rec(v, i+1, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, 0, 0);
}

 

7. 15656

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;

void rec(vector<int> v, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = 0; i < n; ++i){
        v.push_back(input[i]);
        rec(v, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    rec(v, 0);
}

 

8. 15657

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = pos; i < n; ++i){
        v.push_back(input[i]);
        rec(v, i, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, 0, 0);
}

 

중복을 제거하기 위해 출력 전 수열을 vector에 넣은 후 erase( )를 사용하여 중복을 제거한 후 한번에 출력했다.

9. 15663

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;
vector<vector<int>> output;

void rec(vector<int> v, vector<bool> visited, int cnt){
    if(cnt == m){
        output.push_back(v);
    }

    for(int i = 0; i < n; ++i){
        if(visited[i])
            continue;
        visited[i] = true;
        v.push_back(input[i]);
        rec(v, visited, cnt+1);
        visited[i] = false;
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    vector<bool> visited(n+1);
    rec(v, visited, 0);

    sort(output.begin(), output.end());
    output.erase(unique(output.begin(), output.end()), output.end());
    int len = output.size();
    for(int i = 0; i < len; ++i){
        for(int j = 0; j < m; ++j){
            cout << output[i][j];
            if(j < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
    }
}

 

10. 15664

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;
vector<vector<int>> output;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        output.push_back(v);
        return;
    }

    for(int i = pos; i < n; ++i){
        v.push_back(input[i]);
        rec(v, i+1, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());

    vector<int> v;
    rec(v, 0, 0);

    sort(output.begin(), output.end());
    output.erase(unique(output.begin(), output.end()), output.end());
    int len = output.size();
    for(int i = 0; i < len; ++i){
        for(int j = 0; j < m; ++j){
            cout << output[i][j];
            if(j < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
    }
}

 

11. 15665

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;

void rec(vector<int> v, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = 0; i < n; ++i){
        v.push_back(input[i]);
        rec(v, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());
    input.erase(unique(input.begin(), input.end()), input.end());
    n = input.size();

    vector<int> v;
    rec(v, 0);
}

 

12. 15666

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, m;
vector<int> input;
vector<vector<int>> output;

void rec(vector<int> v, int pos, int cnt){
    if(cnt == m){
        for(int i = 0; i < m; ++i){
            cout << v[i];
            if(i < m-1)
                cout << ' ';
            else
                cout << '\n';
        }
        return;
    }

    for(int i = pos; i < n; ++i){
        v.push_back(input[i]);
        rec(v, i, cnt+1);
        v.pop_back();
    }
}

int main(void){
    cin >> n >> m;
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        input.push_back(num);
    }
    sort(input.begin(), input.end());
    input.erase(unique(input.begin(), input.end()), input.end());
    n = input.size();

    vector<int> v;
    rec(v, 0, 0);
}

 

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 1719 : 택배  (0) 2020.12.22
[C++] 백준 - 15684 : 사다리 조작  (0) 2020.12.21
[C++] 백준 - 17828 : 문자열 화폐  (0) 2020.12.19
[C++] 백준 - 1987 : 알파벳  (0) 2020.12.19
[C++] 백준 - 1027 : 고층 건물  (0) 2020.12.19

+ Recent posts