[BOJ] 15650. N과 M(2)
15 Apr 2026
Reading time ~1 minute
풀이
import java.util.Scanner;
public class Main {
static int a[]= new int [8]; // 1<=M<=N<=8이 이므로 최대 8자리 필요
// 위치가 인덱스가 되고 인덱스는 0부터 시작된다고 하자!
static boolean c[]=new boolean[9]; // 중복을 체크하기 위한 배열
// 0은 무시하기 위해 +1만큼
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt();
go(0,N,M,1); // 0번째 위치 부터 숫자 채울 예정이므로
}
public static void go(int index,int N, int M,int start) {
if(index==M) {// 위치(인덱스)가 0부터 M-1까지 M개를 채웠으므로 마지막 순간은 M-1에서 M번째 위치로 넘어갈 때이므로
for (int i = 0; i < M; i++) { // 위치(인덱스)가 0부터 M-1까지 M개를 채웠으므로 그 위치까지 출력
System.out.print(a[i]+" ");
}
System.out.printf("\n"); // 한 싸이클의 숫자를 택하여 출력하였으므로 개행
return ; // 출력 했으니 함수 호출 끝냄.
}
for(int i=start;i<=N;i++) {
if(c[i]) continue; // 사용한 숫자면 넘어가라(중복불가이므로)
a[index]=i; // 숫자를 차례로 채우다가 index번째 위치에 채울 수로는 사용되지 않은 변수 i가 오면 됌.
c[i]=true; // index번째 위치에 숫자 i를 채웠으므로 숫자 i를 사용했다라고 처리해줌.
go(index+1,N,M,i+1); // 다음 위치 숫자를 현재 위치에서 선택한 i보다 큰 값으로 채워줘!
c[i]=false; // 재귀 함수 호출이 끝나면 함수는 끝난거니까 false로 바꿔주면 됨.
}
}
}