1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열. 같은 수를 여러 번 골라도 된다.
N과 M(2)와 다른 점은 중복이 허용된다는 것이다. 중복을 체크하기 위해 사용했던 visited배열을 사용하지 않는다.
원래 했던 방식은 System.out.println() 으로 그냥 찍었던 방식이지만 이렇게 하면 시간초과가 나기 때문에 시간단축을 위해 BufferedWriter를 사용한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class BOJ15651_N과M3 {
static int N, M;
// static boolean[] visited;
static int[] a; // 실제 출력값을 담을 배열
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] temp = br.readLine().split(" ");// temp에 " "을 기준으로 String을 나눠 담음.
N = Integer.parseInt(temp[0]); // String을 int로 변환 후 담음.
M = Integer.parseInt(temp[1]);
// visited = new boolean[N + 1];
a = new int[N + 1];
dfs(1, 1, bw);
bw.flush();
bw.close();
br.close();
}
static void dfs(int depth, int com, BufferedWriter bw) {
if (depth == M + 1) {// 종료 지점
try {
for (int i = 1; i <= M; i++) {
bw.write(String.valueOf(a[i]) + " ");
}
bw.write("\n");
} catch (IOException e) {
e.printStackTrace();
}
return;
}
for (int i = 1; i <= N; i++) {
// visited[i] = true;
a[depth] = i;
dfs(depth + 1, i, bw);
// visited[i] = false;
}
}
}