일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- rustup
- 팰린드롬수
- 3190
- 14501
- 10872
- 분해합
- 13460
- 2798
- 14503
- 테트로미노
- 14891
- 13458
- rust설치
- 러스트란 #cargo
- C
- 14888
- 15651
- 15652
- 연산자 끼워넣기 성공
- C++
- 15649
- 15683
- 9663
- 백트래킹
- 백준
- 문제풀이
- 14500
- 14890
- 15650
- 1259
Archives
Easy-So-Easy
[백준] 15649번 N과 M (1) - C/C++ 본문
반응형
문제(Problem)
풀이(Solution)
이 문제는 조합의 개수를 이용하는 문제이며 재귀함수와 간단한 로직으로 풀이가 가능합니다. 문제의 핵심 포인트를 말씀드리자면, 1~N까지의 자연수를 고르는데 중복이 불가능하다는 점입니다.
각 숫자들을 딱 한 번씩만 사용할 수 있도록 visited 배열로 사용 여부를 체크하여 중복을 피해줍니다.(visited가 fasle이면 -> 사용 / visited 가 true이면 -> 사용 불가)
func 함수와 print 함수를 사용하였으며 각각 조합을 뽑는 함수(func 함수), depth가 m이 되었을 때 출력하는 함수(print 함수)로 구성됩니다.
func의 재귀 호출이 M번 이루어지면(즉, visited의 true의 개수가 m이 되면) print 함수를 통해 계속해서 결과를 출력해줍니다.
코드(Code)
#include<iostream>
using namespace std;
int n, m;
int visited[9];
int arr[9];
void print() {
for(int i=0; i<m; i++)
cout << arr[i] << ' ';
cout << '\n';
}
void func(int depth) {
if(depth==m) {
print();
return;
}
for(int i=1; i<=n; i++) {
if(visited[i]) continue;
visited[i]=1;
arr[depth]=i;
func(depth+1);
visited[i]=0;
}
}
int main() {
cin >> n >> m;
func(0);
}
반응형
'BaekJoon' 카테고리의 다른 글
[백준] 2580번 스도쿠 - C/C++ (0) | 2023.06.21 |
---|---|
[백준] 9663번 N-Queen - C/C++ (0) | 2023.06.20 |
[백준] 15652번 N과 M (4) - C/C++ (0) | 2023.06.20 |
[백준] 15651번 N과 M (3) - C/C++ (0) | 2023.06.20 |
[백준] 15650번 N과 M (2) - C/C++ (0) | 2023.06.20 |