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