https://www.acmicpc.net/problem/15657
15657번: N과 M (8)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
솔루션
이 문제는 N과 M의 또 다른 변형으로 백트래킹에 이해를 돕기에 아주 좋은 문제인 것 같다.
나는 값을 입력을 받아서, 정렬을 하고
각각의 인덱스와 깊이를 인자로 넘겨주어서,
인덱스를 몇 번 골랐는지 체크 하고, 깊이가 만족이 된다면 출력을 하도록 코드를 짰다.
코드
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
vector<int> arr;
int N, M;
int print[9];
void printNM(int idx, int deep) {
if (deep == M) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < print[i]; j++) {
cout << arr[i] << " ";
}
}
cout << "\n";
}
else {
for (int i = idx; i < N; i++) {
print[i]++;
printNM(i, deep+1);
print[i]--;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i = 0; i < N; i++) {
int val;
cin >> val;
arr.push_back(val);
}
sort(arr.begin(), arr.end());
printNM(0, 0);
}
'백준' 카테고리의 다른 글
C++ [백준]17144번 미세먼지 안녕! (1) | 2022.04.07 |
---|---|
C++ [백준]10868번 최솟값 (0) | 2022.04.07 |
C++ [백준]1504번 특정한 최단 경로 (0) | 2022.04.05 |
C++ [백준]1806번 부분합 (0) | 2022.04.05 |
C++ [백준]1197번 최소 스패닝 트리 (0) | 2022.04.05 |