알고리즘(BOJ)/Silver

백준 - N과M(1) 15649 (백트래킹)

ch.0 2023. 3. 28. 17:45


문제 분석

겹치는 수를 제외하고 재귀를 이용해서 풀면 되는걸로 이해했다. 해당 길이가 되면 return해주고 그렇지 않다면 1씩 증가하면서 재귀를 타도록 했다.

 

 

 

 

 

전체 소스

package test;

import java.util.*;
import java.io.*;

import java.util.*;

public class Main {

	static int N, M;
	static int[] pick;
	static boolean[] visited;
	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());

		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());

		pick = new int[M];
		visited = new boolean[N];
		dfs(0, 0);
		System.out.println(sb);
	}

	public static void dfs(int start, int depth) {

		if (depth == M) {
			for (int i = 0; i < M; i++) {
				sb.append(pick[i]).append(' ');
			}
				sb.append('\n');
			return;
		}

		else {
			for (int i = 0; i < N; i++) {
				if (!visited[i]) {
					visited[i] = true;
					pick[depth] = i + 1;
					dfs(start + 1, depth + 1);
					visited[i] = false;
				}
			}
		}

	}

}

 

 

 

 

 


https://www.acmicpc.net/problem/15649

 

15649번: N과 M (1)

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

www.acmicpc.net

문제