Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[BOJ] 15654 - N과 M(5) 본문
728x90
반응형
https://www.acmicpc.net/problem/15654
BOJ - N과 M(5)
문제 유형: 백트래킹, dfs, 재귀
문제 난이도: Silver III
시간 제한: 1초
메모리 제한: 512MB
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
풀이
우선, 입력받은 N개의 수를 정렬해준다.
그리고, 다음의 재귀를 호출한다: solve(seq, arr);
base case: 만약 seq의 요소가 m개라면, 수열을 하나 완성한 것이므로 출력한다.
아니라면, 새로 추가해보자. i부터 n까지 다음을 시도한다:
만약 현재 seq에 arr[i]가 없으면, seq에 넣어보고 solve를 호출한 뒤, 도로 뺀다.
코드
C++
#include <bits/stdc++.h>
using namespace std;
int n, m;
void solve(vector<int> &seq, vector<int> &arr) {
if (seq.size() == m) {
for (const auto &element : seq) {
cout << element << " ";
}
cout << "\n";
return;
}
for (int i = 0; i < n; ++i) {
if (find(seq.begin(), seq.end(), arr[i]) == seq.end()) {
seq.emplace_back(arr[i]);
solve(seq, arr);
seq.pop_back();
}
}
}
int main(int argc, char *argv[]) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
vector<int> arr(n);
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
vector<int> seq;
solve(seq, arr);
return 0;
}
728x90
반응형
'PS > BOJ' 카테고리의 다른 글
[BOJ] 16953 - A → B (0) | 2024.10.25 |
---|---|
[BOJ] 15663 - N과 M(9) (0) | 2024.10.25 |
[BOJ] 15652: N과 M(4) (0) | 2024.10.23 |
[BOJ] 11725 - 트리의 부모 찾기 (0) | 2024.10.22 |
[BOJ] 11053: 가장 긴 증가하는 부분 수열 (0) | 2024.10.21 |