반응형
permutation을 만들 때, 섞어야하는 배열이 있다면, 그 배열의 index를 섞는다 라고 생각하면 편하다.
하나를 여러번 뽑을 순 없으므로 visited[] bool 배열로 한 index가 두번 선택되게 하지 않게끔 막는다.
출력 조건이 사전순으로 증가하는(오름차순) 순서로 출력해야 하기 때문에 permutation을 실행하기 전에 sort후 실행한다.
C++ 풀이
#include <bits/stdc++.h>
using namespace std;
vector<int> v;
vector<int> permu;
bool visited[9];
int M, N;
void print_permu()
{
for (int i = 0; i < permu.size(); i++)
{
cout << permu[i] << " ";
}
cout << '\n';
}
void dfs(int start)
{
if ((int)permu.size() == M) {
print_permu();
return;
}
for (int i = 0; i < N; i++)
{
if (!visited[i]) {
visited[i] = true;
permu.push_back(v[i]);
dfs(i + 1);
permu.pop_back();
visited[i] = false;
}
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
for (int i = 1; i <= N; i++)
{
int temp;
cin >> temp;
v.push_back(temp);
}
sort(v.begin(), v.end());
dfs(0);
}
Python 풀이
itertools에 permutation이 존재하니 사용하자.
import sys
from itertools import permutations
input = sys.stdin.readline
N, M = map(int,input().rstrip().split())
permu = list(map(int,input().rstrip().split()))
permu.sort()
permu_list = list(permutations(permu, M))
for item in permu_list:
for i in item:
print(i, end = ' ')
print()
반응형
'Algorithm > Problem Solve' 카테고리의 다른 글
[백준 11053번] 가장 긴 증가하는 부분 수열 (C++) (0) | 2021.01.07 |
---|---|
[백준 9465번] 스티커 (C++) (0) | 2021.01.06 |
[백준 15650번] N과 M(2) (C++ / Python) (0) | 2021.01.02 |
[백준 1753번] 최단경로 (C++) (0) | 2020.12.31 |
[백준 1167번] 트리의 지름 (C++ / Python) (0) | 2020.12.30 |