백준 - 15649번 N과 M
2025. 4. 8. 18:22
import java.util.Scanner;

public class Main_15649 {
/*
문제)
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열

입력)
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)

출력)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.	
 */
	static int N,M;
	static int[]answer;
	static boolean[] visited;//전체요소 중 각각의 요소가 선택되었는지 여부를 판단
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt(); //전체 데이터 개수(자연수)
		M = scan.nextInt(); //고를 수 있는 개수
		
		answer = new int[M];
		visited = new boolean[N+1]; //자연수가 1부터 시작하기 때문에
		
		permute(0); //0: 몇개를 선택했는지 표현
		
		scan.close();
    }//main

	private static void permute(int depth) {//재귀함수
		//끝날 조건
		if(depth == M) { //선택을 끝마쳤을때
			for(int num : answer){//선택데이터 출력
				System.out.print(num+" ");
			}
			System.out.println();
		   
		  return;//끝마쳐!! (나를 호출한 메서드에게 제어권 넘기기)
		}
		
	   //반복 처리문	
	   for(int i=1; i<=N; i++){//선택할 수 있는 요소에 대한 표현	
		  if( !visited[i] ){//선택여부 묻기 (선택이 안되었을때)
			  answer[depth]=i;//선택해!! i는 자연수를 의미
			  visited[i]=true;//선택되었다를 표시
			  
	          permute(depth+1); //다음 선택을 표현
	          
	          visited[i]=false;//원상태로 복구
		  }
	   }
	}//permute
}

'코딩테스트' 카테고리의 다른 글

백준 - 15650번 N 과 M (2)  (0) 2025.04.08
Recursive(재귀)  (0) 2025.04.08
SubSet(부분집합)  (0) 2025.04.08
Combination(조합)  (0) 2025.04.08
순열(Permutation) 예제  (0) 2025.04.08