Algorithm

[알고리즘] 완전 탐색 - 조합 (백준 15650번. N과 M(2) - JAVA)

오초의 기록 2022. 4. 9. 01:45

조합

서로 다른 n개에서 순서 없이 r개를 뽑는 경우의 수

(1) 중복 없이 (2) 고르기

 

ex) 조합은 순서가 없으므로 [1,2] 와 [2,1]을 같은 것으로 취급한다. 

 

백준 15650번. N과 M(2)

 

조건 

 
  • 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
  • 고른 수열은 오름차순이어야 한다.

 

풀이 방법

  • 재귀 사용(백트래킹)
  • Scanner + StringBuffer 
  • 현재 선택한 원소 이후의 것들을 선택 가능하므로 start 변수를 +1씩 해서 넘겨준다. 
import java.util.Scanner;

public class Main {
    static int N, M;
    static int[] out;
    static boolean[] visited;
    static StringBuffer sb = new StringBuffer();

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        N = scanner.nextInt();
        M = scanner.nextInt();

        out = new int[M];
        visited = new boolean[N+1];

        combination(0, 1, out);
        System.out.println(sb);


    }

    private static void combination(int depth, int start, int[] out) {
        if(depth == M){
            for(int num : out) sb.append(num).append(" ");
            sb.append("\n");
            return;
        }

        for(int i = start; i<=N; i++){
            if(!visited[i]){
                visited[i] = true;
                out[depth] = i;
                combination(depth+1, start+=1, out);
                visited[i] = false;
            }
        }
    }
}