[백준 15650번 C/C++] N과 M(2)
[백준 15650번 C/C++] N과 M(2)
https://www.acmicpc.net/problem/15650
15650번: N과 M (2)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
해결전략
조합 Combination, 백트랙킹 Backtracking
정답 코드
#include <iostream>
#include <vector>
using namespace std;
int n, m;
int arr[9], ch[9]; // arr는 선택된 수를 저장하는 배열, ch는 해당 수가 선택되었는지를 확인하는 체크 배열
void DFS(int idx, int cnt) // idx는 현재 탐색을 시작할 위치, cnt는 현재까지 선택된 숫자의 개수
{
if (cnt == m) // m개의 숫자가 모두 선택되었다면 해당 수열을 출력
{
for (int i = 0; i < m; i++) {
cout << arr[i] << " ";
}
cout << "\n";
return;
}
for (int i = idx; i <= n; i++) // idx부터 n까지의 수에 대해 탐색
{
if (ch[i] == 0) // 만약 i가 아직 선택되지 않았다면
{
ch[i] = 1; // i를 선택
arr[cnt] = i; // arr의 cnt 위치에 i를 저장
DFS(i + 1, cnt + 1); // 다음 숫자를 선택하기 위해 DFS 함수를 재귀 호출
ch[i] = 0; // 재귀 호출이 끝나면 i의 선택을 취소. 이는 다른 수열을 생성하기 위한 백트래킹
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin >> n >> m;
DFS(1, 0);
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 13549번 C/C++] 숨박꼭질 3 (0) | 2023.12.20 |
---|---|
[백준 11725번 C/C++] 트리의 부모 찾기 (0) | 2023.12.19 |
[백준 9251번 C/C++] LCS (Longest Common Subsequence, 최장 공통 부분 수열) (0) | 2023.12.15 |
[백준 1238번 C/C++] 파티 (0) | 2023.12.14 |
[백준 1043번 C/C++] 거짓말 (0) | 2023.12.13 |
댓글
이 글 공유하기
다른 글
-
[백준 13549번 C/C++] 숨박꼭질 3
[백준 13549번 C/C++] 숨박꼭질 3
2023.12.20 -
[백준 11725번 C/C++] 트리의 부모 찾기
[백준 11725번 C/C++] 트리의 부모 찾기
2023.12.19 -
[백준 9251번 C/C++] LCS (Longest Common Subsequence, 최장 공통 부분 수열)
[백준 9251번 C/C++] LCS (Longest Common Subsequence, 최장 공통 부분 수열)
2023.12.15 -
[백준 1238번 C/C++] 파티
[백준 1238번 C/C++] 파티
2023.12.14