Home 백준 n과m
Post
Cancel

백준 n과m


N과M 1

수열이 중복되면 안되지만 원소들은 중복이 되면 되기 때문에 arr배열 전역변수에 값을 계속 바꿔가며 출력해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class N과M {
	
	static List<List<Integer>> answerList = new ArrayList<>();
	static int[] arr;
	static boolean[] visit;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		arr = new int[m];
		visit = new boolean[n];
		
		dfs(n, m, 0);
	}
	
	static void dfs(int N, int M, int depth) {
		if (depth == M) {//최대 깊이까지 탐색햇으면 출력
			for (int val : arr) {
				System.out.print(val + " ");
			}
			System.out.println();
			return;
		}
 
		for (int i = 0; i < N; i++) {
			if (!visit[i]) {//방문안했으면
				visit[i] = true;//방문처리
				arr[depth] = i + 1;
				dfs(N, M, depth + 1);
				visit[i] = false;//방문X
			}
		}
	}
}

N과M 2

1번문제와는 다르게 각 원소들도 중복이 되지않는다, 그렇다는 의미는 1이상 인덱스수가 0인덱스수보다 클수가 없다.
그렇기 때문에 check라는 방문배열을 만들어 시작 인덱스부터 방문을 하고 출력해주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;

public class N과M2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		dfs(m,0,new boolean[n]);
	}
	
	static void dfs(int m, int index, boolean[] check) {
		if(m==0) {//check에 방문표시가 다 찼으면
			for(int i=0; i<check.length; i++) {
				if(check[i]) {
					System.out.print(i+1+" ");
				}
			}
			System.out.println();
		}
		else {
			for(int i=index; i<check.length; i++) {
				check[i]=true;
				dfs(m-1, index+1, check);
				check[i]=false;
				index++;
			}
		}
	}
}

N과M 3

1번과 다르게 동일한 원소가 배열에 들어갈수있다.
그래서 방문처리를 따로 하지 않았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import java.util.Scanner;

public class N과M3 {
	
	static int[] arr;
	static StringBuilder str = new StringBuilder();
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		arr = new int[m];
		
		dfs(n, m, 0, 0);
		
		System.out.println(str);
	}
	
	static void dfs(int n, int m, int index, int depth) {
		if(m==depth) {//끝까지 탐방하였으면
			for(int i=0; i<m; i++) {
				str.append(arr[i]+" ");
			}
			str.append("\n");
		}
		else {
			for(int i=0; i<n; i++) {
				arr[index]=i+1;
				dfs(n, m, index+1, depth+1);
			}
		}
	}
}

N과M 4

3번과 다르게 1번째 인덱스부터 0번째 인덱스보다 작으면 안되기 때문에 currentNum이라는 변수를 사용하여 작은값이 들어가지 않도록 구현했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;

public class N과M4 {
	static int[] arr;
	static StringBuilder str = new StringBuilder();
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		
		arr = new int[m];//배열수만큼 초기화
		
		dfs(n, m, 0, 0, 1);
		
		System.out.println(str);
	}
	
	static void dfs(int n, int m, int index, int depth, int currentNum) {
		if(m==depth) {//끝까지 탐색했을시
			for(int i=0; i<m; i++) {
				str.append(arr[i]+" ");
			}
			str.append("\n");
		}
		else {
			for(int i=0; i<n; i++) {
				if(currentNum>i+1) {
					continue;
				}
				arr[index]=i+1;
				dfs(n, m, index+1, depth+1, i+1);
			}
		}
	}
}
This post is licensed under CC BY 4.0 by the author.
Contents