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>

 

##문제이해##

기존 문제인 NM 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;
			}
		}
	}

}
반응형