Post

๐Ÿงฉ Baekjoon โ–กโ–กโ–กโ–ก - N๊ณผ M(1 ~ 12)

๐Ÿงฉ Baekjoon โ–กโ–กโ–กโ–ก - N๊ณผ M(1 ~ 12)

N๊ณผ M(1)

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ ์ค‘๋ณต ์—†์ด M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
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
public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static int n, m;
	static boolean[] visited;
	
	// ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
	static void backtracking(int depth, String str) {
		if (depth == m) {
			System.out.println(str);
			return;
		}
		
		for (int i=1; i<n+1; i++) {
			if (!visited[i]) {
				visited[i] = true;
				backtracking(depth + 1, str + i + " ");
				visited[i] = false;
			}
		}
	}
	
	// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		visited = new boolean[n + 1];
		
		// 2. ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ
		backtracking(0, "");
	}
}

N๊ณผ M(2)

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ย ์ž์—ฐ์ˆ˜ ์ค‘์—์„œย M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
// static void backtracking(int start, int depth, String str)
for (int i=start; i<n+1; i++) {
	if (!visited[i]) {
		visited[i] = true;
		backtracking(i+1, depth + 1, str + i + " ");
		visited[i] = false;
	}
}
  • ์ˆ˜์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ˆซ์ž๋ณด๋‹ค ์ปค์•ผ ํ•˜๋ฏ€๋กœ Back-tracking ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ i + 1์„ ์ธ์ž์— ์ „๋‹ฌํ•œ๋‹ค.

N๊ณผ M(3)

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ย ์ž์—ฐ์ˆ˜ ์ค‘์—์„œย M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
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
public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static int n, m;
	static StringBuilder sb = new StringBuilder();
	
	// ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
	static void backtracking(int depth, String str) {
		if (depth == m) {
			sb.append(str).append("\n");
			return;
		}
		
		for (int i=1; i<n+1; i++) {
			backtracking(depth + 1, str + i + " ");
		}
	}
	
	// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		
		// 2. ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ
		backtracking(0, "");
		
		// 3. ์ถœ๋ ฅ
		System.out.println(sb.toString());
	}
}
  • ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด StringBuilder๋ฅผ ํ†ตํ•ด ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.
  • visited ๋ฐฐ์—ด์„ ์—†์• ์„œ ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณ ๋ฅผ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๋‹ค.

N๊ณผ M(4)

  • 1๋ถ€ํ„ฐ N๊นŒ์ง€ย ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
// static void backtracking(int start, int depth, String str)
for (int i=start; i<n+1; i++) {
	backtracking(i, depth + 1, str + i + " ");
}
  • N๊ณผ M (3) ๋ฌธ์ œ์—์„œ Back-tracking ๋ฉ”์„œ๋“œ์— start ์ธ์ž๋งŒ ํฌํ•จํ•˜๋ฉด ๋œ๋‹ค.
  • ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๊ฒŒ๋” start์—๋Š” i๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

N๊ณผ M(5)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
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
42
43
44
45
public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static int n, m;
	static Set<Integer> visited;
	static List<Integer> nums;
	static StringBuilder sb = new StringBuilder();
	
	// ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
	static void backtracking(int depth, String str) {
		if (depth == m) {
			sb.append(str).append("\n");
			return;
		}
		
		for (int i: nums) {
			if (!visited.contains(i)) {
				visited.add(i);
				backtracking(depth + 1, str + i + " ");
				visited.remove(i);
			}
		}
	}
	
	// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st1 = new StringTokenizer(br.readLine());
		StringTokenizer st2 = new StringTokenizer(br.readLine());
		nums = new ArrayList<>();
		n = Integer.parseInt(st1.nextToken());
		m = Integer.parseInt(st1.nextToken());
		visited = new HashSet<>();
		
		// 2. ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
		for (int i=0; i<n; i++) nums.add(Integer.parseInt(st2.nextToken()));
		Collections.sort(nums);
		
		// 3. ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ
		backtracking(0, "");
		
		// 4. ์ถœ๋ ฅ
		System.out.println(sb.toString());
	}
}
  • List ์•ˆ์— ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ธ๋ฑ์Šค๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Set ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

N๊ณผ M(6)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
9
10
// static void backtracking(int start, int depth, String str)
int num = 0;
for (int i=start; i<n; i++) {
	num = nums.get(i);
	if (!visited.contains(num)) {
		visited.add(num);
		backtracking(i + 1, depth + 1, str + num + " ");
		visited.remove(num);
	}
}

์˜ค๋ฆ„์ฐจ์ˆœ ์กฐ๊ฑด์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด N๊ณผ M (5) ๋ฌธ์ œ์—์„œ Back-tracking ๋ฉ”์„œ๋“œ์— start ์ธ์ž๋งŒ ํฌํ•จํ•˜๋ฉด ๋œ๋‹ค.

N๊ณผ M(7)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
1
2
3
4
// static void backtracking(int depth, String str)
for (int i : nums) {
	backtracking(depth + 1, str + i + " ");
}
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋˜๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

N๊ณผ M(8)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
// static void backtracking(int start, int depth, String str)
int num = 0;
for (int i=start; i<n; i++) {
	num = nums.get(i);
	backtracking(i, depth + 1, str + num + " ");
}
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋˜๋ฏ€๋กœ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋ฏ€๋กœ start ์ธ์ž์—๋Š” ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์ธ๋ฑ์Šค๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

N๊ณผ M(9)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ์ž…๋ ฅ๋œ ์ž์—ฐ์ˆ˜๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๋‹ค.
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
42
43
44
45
46
47
48
public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static int n, m;
	static boolean[] visited;
	static int[] nums;
	static Set<String> resultSet;
	static StringBuilder sb = new StringBuilder();
	
	// ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
	static void backtracking(int depth, String str) {
		if (depth == m && !resultSet.contains(str)) {
			resultSet.add(str);
			sb.append(str).append("\n");
			return;
		}
		
		for (int i=1; i<=n; i++) {
			if (!visited[i]) {
				visited[i] = true;
				backtracking(depth + 1, str + nums[i] + " ");
				visited[i] = false;
			}
		}
	}
	
	// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st1 = new StringTokenizer(br.readLine());
		StringTokenizer st2 = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st1.nextToken());
		m = Integer.parseInt(st1.nextToken());
		nums = new int[n + 1];
		visited = new boolean[n + 1];
		resultSet = new HashSet<>();
		
		// 2. ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
		for (int i=0; i<n; i++) nums[i + 1] = Integer.parseInt(st2.nextToken());
		Arrays.sort(nums);
		
		// 3. ๋ฐฑ ํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ
		backtracking(0, "");
		
		// 4. ์ถœ๋ ฅ
		System.out.println(sb.toString());
	}
}
  • ์ž…๋ ฅ์— ์ค‘๋ณต๋œ ์ˆ˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ nums์™€ visited๋ฅผ ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.

N๊ณผ M(10)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
5
6
7
8
// static void backtracking(int start, int depth, String str)
for (int i=start; i<=n; i++) {
	if (!visited[i]) {
		visited[i] = true;
		backtracking(i, depth + 1, str + nums[i] + " ");
		visited[i] = false;
	}
}
  • N๊ณผ M (9) ๋ฌธ์ œ์—์„œ Back-tracking ๋ฉ”์„œ๋“œ์— start ์ธ์ž๋งŒ ํฌํ•จํ•˜๋ฉด ๋œ๋‹ค.
  • ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๋„๋ก start์—๋Š” i๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

N๊ณผ M(11)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
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
42
43
44
45
46
public class Main {
	// ์ „์—ญ ๋ณ€์ˆ˜
	static int n, m;
	static boolean[] visited;
	static int[] nums;
	static Set<String> resultSet;
	static StringBuilder sb = new StringBuilder();
	
	// ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ
	static void backtracking(int depth, String str) {
		if (depth == m) {
			if (!resultSet.contains(str)) {
				resultSet.add(str);
				sb.append(str).append("\n");
			}
			return;
		}
		
		for (int i=1; i<=n; i++) {
			backtracking(depth + 1, str + nums[i] + " ");
		}
	}
	
	// ๋ฉ”์ธ ๋ฉ”์„œ๋“œ
	public static void main(String[] args) throws IOException {
		// 1. ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐ ์ดˆ๊ธฐํ™”
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st1 = new StringTokenizer(br.readLine());
		StringTokenizer st2 = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st1.nextToken());
		m = Integer.parseInt(st1.nextToken());
		nums = new int[n + 1];
		visited = new boolean[n + 1];
		resultSet = new HashSet<>();
		
		// 2. ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
		for (int i=0; i<n; i++) nums[i + 1] = Integer.parseInt(st2.nextToken());
		Arrays.sort(nums);
		
		// 3. ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋ฆฌ
		backtracking(0, "");
		
		// 4. ์ถœ๋ ฅ
		System.out.println(sb.toString());
	}
}
  • ๋‹ค์Œ ์ฝ”๋“œ ๋•Œ๋ฌธ์— ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊นŠ์ด๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋ฉด์„œ StackOverflowError ๋ฐœ์ƒ
1
2
3
4
5
if (depth == m && !resultSet.contains(str)) {
	resultSet.add(str);
	sb.append(str).append("\n");
	return;
}
  • ์ด๋ฏธ ์„ธํŠธ์— ์žˆ๋Š” ๊ฐ’์ผ ๊ฒฝ์šฐ return์„ ํ•˜์ง€ ์•Š๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์ฝ”๋“œ๋กœ ์ˆ˜์ •ํ•˜์˜€๋‹ค.
1
2
3
4
5
6
7
if (depth == m) {
	if (!resultSet.contains(str)) {
		resultSet.add(str);
		sb.append(str).append("\n");
	}
	return;
}

N๊ณผ M(12)

  • N๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ์ค‘์—์„œ M๊ฐœ๋ฅผ ๊ณ ๋ฅธ ์ˆ˜์—ด
  • ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณจ๋ผ๋„ ๋œ๋‹ค.
  • ๊ณ ๋ฅธ ์ˆ˜์—ด์€ ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.
1
2
3
4
// static void backtracking(int start, int depth, String str)
for (int i=start; i<=n; i++) {
	backtracking(i, depth + 1, str + nums[i] + " ");
}
  • ๋น„๋‚ด๋ฆผ์ฐจ์ˆœ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ start๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ i๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.