15654문제 N과M 5번(브루트포스) Java
2021. 9. 18. 20:06ㆍ알고리즘/백준 알고리즘기초
반응형
문제
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
입력
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
출처: <https://www.acmicpc.net/problem/15654>
##문제이해##
기존 문제인 N과M의 1번과 동일한 결과를 원하지만 주어지는 방식이 다르다.
기존에는 주어진수를 그대로 출력하면되는데
이번에는 주어진 수를 배열에 담아놓고 먼저 정렬을 수행한뒤 DFS를 수행해야했다.
##코드##
import java.util.Arrays;
import java.util.Scanner;
public class boj_15654 {
static Scanner sc;
static int N; //숫자의 범위. ex 4라면 1,2,3,4 까지의 범위.
static int M; //조합하는 숫자의 갯수 ex) 4라면 총 만드는 숫자가 1 2 3 4 와같이 4개의 수를 가진다.
static boolean[] visit; //총 숫자의 갯수만큼 만든다.
static int[] arr;
static int[] result;
static StringBuffer sb;
public static void main(String[] args) {
sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
visit = new boolean[N];
arr= new int[N];
result = new int[M];
for(int i=0; i<N;i++) {
arr[i]=sc.nextInt();//각각 숫자들을 배열에 담는다.
}
//순서때문에 배열을 정렬
Arrays.sort(arr);
dfs(0);
}
public static void dfs(int depth) {
//종료조건
if(depth==M) {
sb = new StringBuffer();
for(int i : result) {
sb.append(i+" ");
}
System.out.println(sb);
return;
}
for(int i=0; i<N; i++) {
//중복허용X 방문여부체크
if(visit[i]==false) {
visit[i]=true;
result[depth]= arr[i];
dfs(depth+1);
visit[i]=false;
}
}
}
}
반응형
'알고리즘 > 백준 알고리즘기초' 카테고리의 다른 글
1476문제 날짜 계산(브루트포스) Java (0) | 2021.09.18 |
---|---|
15651문제 N과M 3번(브루트포스) Java (0) | 2021.09.18 |
15649문제 N과M 1번(브루트포스) Java (0) | 2021.09.18 |
9093문제 단어 뒤집기 Java (0) | 2021.09.18 |
10828번 스택(구현) Java (0) | 2021.09.17 |