๐งฉ 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.