백준(JAVA) 풀이/백트래킹

백준(JAVA) 15649번 N과 M (1) 풀이

개발윗미 2022. 11. 5. 19:38

Java로 구현한 15649번 N과 M (1) 문제 풀이입니다.

 

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

 

15649번: N과 M (1)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net


import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		int[] data = new int[N];
		for (int i=1; i<N+1; i++)
			data[i-1] = i;
		
		int[] output = new int[N];
		boolean[] visited = new boolean[N];
		permutations(data, output, visited, 0, N, M);
	}
	
	public static void permutations(int[] arr, int[] output, boolean visited[], int depth, int n, int r) {
		if (depth == r) {
			print(output, r);
			return;
		}
		
		for (int i=0; i<n; i++) {
			if (!visited[i]) {
				visited[i] = true;
				output[depth] = arr[i];
				permutations(arr, output, visited, depth+1, n, r);
				visited[i] = false;
			}
		}
	}
	
	public static void print(int[] arr, int r) {
		for (int i=0; i<r; i++)
			System.out.print(arr[i] + " ");
		System.out.println();
	}
}

 

1. N과 M을 입력받아 1부터 N까지의 수를 data 배열에 정의한다.

 

2. 순열(permutations)을 통해 각 경우의 수마다 M개의 수를 도출해내 해당 수들을 출력한다.