반응형
해설
간단하게 순열을 구현해보는 문제였다.
기본 배열인 arr에 1~N을 넣어준 다음에 순열을 통해 순서가 있게 선택을 하고 N만큼의 선택을 진행했다면, 해당 순열을 static StringBuilder sb에 넣어줌으로써 저장한 다음에 마지막에 한꺼번에 출력해줌으로써 출력시간을 최소화할 수 있도록 만들었다.
기본 순열을 구현하는 좋은 문제이므로 자주 들여다보면서 순열을 구현하는 감을 익히면 좋을 것 같다.
풀이
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int[] arr;
static int[] sel;
static boolean[] visited;
static StringBuilder sb = new StringBuilder();
public static void main(String args[]) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
arr=new int[N]; // 전체 배열
sel=new int[M]; // 선택된 배열
visited = new boolean[N]; // 방문체크배열
for(int i=0;i<N;i++) { // 1~N까지 arr에 넣기
arr[i]=i+1;
}
recursive(0); // 재귀(순열)
System.out.println(sb);
}
private static void recursive(int k) {
// basis part(종료조건, k만큼 선택되었다면 StringBuilder sb에 포함하고 리턴한다.
if(k==sel.length) {
for (int i = 0; i < sel.length; i++) {
sb.append(sel[i]).append(" ");
}
sb.append("\n");
return;
}
for (int i = 0; i < arr.length; i++) {
if(!visited[i]) { // 방문되지 않은 인덱스라면 방문체크하고 sel에 해당 수를 넣고 재귀에 들어간다.
visited[i]=true;
sel[k]=arr[i];
recursive(k+1);
visited[i]=false; // 원복한다.
}
}
}
}
반응형