Java/Algorithm

[Java-Algorithm] 백준 15650 N과 M (2) 풀이

Jeong Jeon
반응형

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

 

15650번: N과 M (2)

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해

www.acmicpc.net

 

2). 풀이 : 

N과 M (1) 에서 수열이 순서대로 인 것들만 출력하는 문제.

이전 숫자와 다음숫자의 비교부분만 추가해주면 된다.

순열만드는 로직만 알고있다면 간단하게 해결할수있다.

 

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];
		boolean[] visited = new boolean[N];
		int[] output = new int[N];

		for (int i = 0; i < N; i++) {
			arr[i] = i+1;
		}

		permute(arr, visited, output, 0, arr.length, M, -1);
	}

	static void permute(int[] arr, boolean[] visited,int[] output,int depth, int length,int cnt, int before) {
		if(depth == cnt) {
			print(output, cnt);
			return;
		}
		//오름차순일때만 출력
		for (int i = 0; i < length; i++) {
			//이전에 고른값보다 작다면 => 순서대로가 아니니까 탈출한다.
			if(arr[i]<before) {
				continue;
			}

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

	static void print(int[] output , int cnt) {
		for (int i = 0; i < cnt; i++) {
				System.out.print(output[i]+" ");
		}
		System.out.println();
	}

 

반응형