[JAVA/백준] SW 역량 테스트 준비-기초 | 브루트 포스 (N과 M): N과 M (10)

👀 문제

https://www.acmicpc.net/problem/15664

👊 도전

1. 설계

  1. n개의 숫자는 중복이 있을 수 있고, 이 중 m개를 뽑은 수열이 중복을 이루지 않도록 해야한다.
  2. prev 변수를 선언하여 이전에 선택한 숫자가 무엇인지 기억한 후, 현재 뽑을 숫자와 겹치지 않도록 한다.
  3. 수열이 비내림차순이 되도록 파라미터 start로 넘겨 for문의 i 시작점을 지정한다.

2. 구현 (성공 코드)

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
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author HEESOO
 *
 */
public class Main {
	static int n, m;
	static int[] array, result;
	static StringBuilder sb;
	public static void dfs(int depth, int start) {
		if(depth==m) {
			for(int i=0;i<m;i++)
				sb.append(result[i]+" ");
			sb.append("\n");
			return;
		}
		int prev=0;
		for(int i=start;i<n;i++) {
			if(prev==array[i]) continue;
			result[depth]=array[i];
			prev=array[i];
			dfs(depth+1, i+1);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		n=scan.nextInt();
		m=scan.nextInt();
		array=new int[n];
		result=new int[m];
		for(int i=0;i<n;i++)
			array[i]=scan.nextInt();
		sb=new StringBuilder();
		
		Arrays.sort(array);
		dfs(0,0);
		System.out.println(sb);
	}
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. DFS를 이용한다
    • 사전순으로 출력해야하므로 dfs() 호출 전 오름차순 정렬한다.
    • dfs의 파라미터 depth는 지금까지 생성한 수열의 길이이다.
    • 중복 사용이 가능하므로 visit[]는 필수가 아니다.
    • prev를 이용하여 이전에 선택한 숫자가 무엇인지 기억한다. 현재 뽑을 숫자가 prev와 같다면 넘긴다.
    • 수열은 비내림차순이 되어야하므로 start 파라미터를 이용해 재귀호출한 지점에서 배열 시작점을 지정해준다.

👏 해결 완료!