알고리즘
[백준알고리즘] 15652 - N과 M (4)
DevBee
2021. 5. 6. 21:06
15652번: N과 M (4)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
이 문제는 중복 조합을 구하는 문제입니다.
기존 조합을 구현한 코드에서 다음에 선택할 수 있는 수의 시작 위치를 선택한 수의 다음이 아닌 지금 선택한 수부터 가능하도록 하여 구현할 수 있습니다.
자바 코드는 다음과 같습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int m = Integer.parseInt(input[1]);
combination(new int[n], n, m, 0, 0);
}
// 중복 조합 구하기
// 선택된 수 배열, 전체 수, 뽑아야하는 수 개수, 시작 인덱스, 실제 선택한 개수
private static void combination(int[] nums, int n, int m, int start, int k) {
// m개를 모두 선택한 경우 선택된 수 출력
if (k == m) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < k; i++) {
sb.append(nums[i]).append(" ");
}
System.out.println(sb);
return;
}
// start부터 하나씩 선택하면서 수 배열에 저장
for (int i = start; i < n; i++) {
nums[k] = i + 1;
combination(nums, n, m, i, k + 1); // i를 뽑았기 때문에 뽑은 수 k+1, 다시 i부터 뽑을 수 있으므로 i 전달
}
}
}