카테고리 없음

[Java-Algorithm] 백준 15654 N과 M(5) 풀이

Jeong Jeon
반응형

1). 문제 : https://www.acmicpc.net/problem/15654

 

15654번: N과 M (5)

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열

www.acmicpc.net

 

2). 풀이 : 

계속 같은 수열 로직의 반복이라 코드를 복사해서 사용하고있다...

이번에는 지난번 로직과 같다고 본다..

우선 방문여부로 중복체크하고, 입력받은 값을 Arrays.sort(); 로 정렬하여 사전순으로 두었다.

 

static StringBuilder sb = new StringBuilder();
	public static void main(String[] args) throws IOException {
		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());

		int[] arr = new int[N];
		st = new StringTokenizer(br.readLine());

		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		//정렬
		Arrays.sort(arr);

		int[] output = new int[N];
		boolean[] visited = new boolean[N];

		permute(arr, output, visited,0, M, -1);
		System.out.println(sb);
	}

	static void permute(int[] arr, int[] output, boolean[] visited, int depth, int cnt, int before) {
		if(depth == cnt) {
			print(output,cnt);
			return;
		}

		for (int i = 0; i < arr.length; i++) {
			if(!visited[i]) {
				visited[i]= true;
				output[depth] = arr[i];
				permute(arr, output, visited,depth+1, cnt, arr[i]);
				visited[i]= false;
			}
		}
	}

	static void print(int[] output, int cnt) {
		for (int i = 0; i < cnt; i++) {
			sb.append(output[i]+" ");
		}
		sb.append("\n");
	}
반응형