BOJ-백준 15654번 N과 M(3) C++ 문제 풀이 입니다.
링크 : https://www.acmicpc.net/problem/15651
15651번: N과 M (3)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
✅ C++ 정답 코드 입니다. 더보기 클릭!
#include <iostream>
#include <vector>
#define MAX 8
using namespace std;
int n,m;
int arr[MAX];
//순열인데 중복해서 뽑아도 됨
void dfs(int depth){
if(depth == m){
for(int i=0; i<m; i++){
cout<<arr[i] <<" ";
}
cout<<"\n";
return;
}
for(int i=1; i<=n; i++){
arr[depth] = i;
dfs(depth+1);
}
}
int main() {
cin >> n>>m;
dfs(0);
}
📌 해설
중복이 있는 순열을 구하는 문제입니다. 백트래킹으로 해결하였습니다. 중복 가능하기 때문에 visited를 검사할 필요가 없었고 depth를 m까지만 dfs수행하면 순열을 구할 수 있습니다.
#include <iostream>
#include <vector>
#define MAX 8
using namespace std;
int n,m;
int arr[MAX];
1. 필요한 변수와 헤더를 추가합니다.
visited는 필요 없기 때문에 arr만 선언하여 중복이 있는 순열을 담습니다.
int main() {
cin >> n>>m;
dfs(0);
}
2. n과 m 을 입력받고 dfs를 호출합니다.
void dfs(int depth){
if(depth == m){
for(int i=0; i<m; i++){
cout<<arr[i] <<" ";
}
cout<<"\n";
return;
}
for(int i=1; i<=n; i++){
arr[depth] = i;
dfs(depth+1);
}
}
3. 백트래킹을 수행할 dfs 입니다.
dfs는 depth 0부터 순차적으로 수행되면서 arr을 갱신합니다.
즉, depth가 m이 되면 arr에 저장된 순열을 출력하고 dfs를 종료합니다.
3-1. 1부터 n까지 숫자를 선택하기 위한 for문을 작성합니다.
3-2. 현재 탐색중인 depth에서 숫자 i를 선택하여 arr을 갱신합니다. 이때, 방문여부는 체크하지 않기 때문에 이전 depth에서 이미 선택한 숫자도 arr에 넣을 수 있습니다.
3-3. arr을 갱신하면 다음 depth를 수행하기 위한 dfs를 호출합니다.
3-4. m 까지 depth를 통해 숫자를 선택하면 arr을 출력하고 dfs를 종료합니다.
::
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif)
'✅ 문제풀이' 카테고리의 다른 글
[그리디 알고리즘] 이코테 - 1이 될 때까지 (0) | 2021.12.01 |
---|---|
프로그래머스 - 괄호변환 파이썬 python (0) | 2021.11.18 |
BOJ-백준 15650번 N과 M(2) C++ (0) | 2021.10.28 |
BOJ-백준 15649번 N과 M(1) C++ (0) | 2021.10.28 |
BOJ-백준 9095번 1,2,3 더하기 C++ (0) | 2021.10.27 |