[문제]
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
[입력]
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
[출력]
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
[예제 입력]
3 1
[예제 출력]
1
2
3
[예제 입력]
4 2
[예제 출력]
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
백트래킹 문제이다.
백트래킹 관련 포스팅 : https://gr616.tistory.com/347
1부터 N까지의 수 중 중복 없이 M개를 고르는 문제이다.방문 여부를 표현할 check배열과 수를 담아줄 arr 배열을 하나 생성했다.
depth가 M인 경우엔 arr 배열에 있는 모든 값을 출력해주고,그렇지 않은 경우엔 반복문을 돈다. (해당 노드 방문하지 않은 경우만)
import java.util.Scanner;
public class Main {
static int N;
static int M;
static int[] arr;
static boolean[] check; // 방문 여부
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
arr = new int[M];
check = new boolean[N];
dfs(0);
}
private static void dfs(int depth) {
if (depth == M) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
return;
}
for (int i = 0; i < N; i++) {
if (!check[i]) { // 방문 X
check[i] = true;
arr[depth] = i + 1;
dfs(depth+1);
check[i] = false;
}
}
}
}'Algorithm > Baekjoon' 카테고리의 다른 글
| 백준 / 2512번 / 예산 (0) | 2023.01.19 |
|---|---|
| 백준 / 1296번 / 팀 이름 정하기 (0) | 2023.01.17 |
| 백준 / 11726번 / 2×n 타일링 (0) | 2023.01.15 |
| 백준 / 1158번 / 요세푸스 문제 (0) | 2023.01.09 |
| 백준 / 1065번 / 한수 (0) | 2023.01.09 |