반응형
DFS를 이용하는 문제였다.
맨처음 문제를 접했을때 아무생각없이 바로 DFS를 적용해봤는데, 역시나 최악의 경우 8^1000(전날의 떡을제외한 경우^날짜수)이 나오기때문에 시간초과를 면할 수 없었다. 그래서 바로 방문체크로 가지치는 방법을 택해주었다. visit[i번째날][떡]을 하나 만들어서 만일 이전날의 떡과 다르면서 visit[오늘][떡]이 방문 가능하다면 방문을 하고 방문체크를 해주는 방식으로 구현해보았다. 이렇게 된다면 어떠한 방식으로든 오늘에서 가질수 있는 떡을 중복으로 방문하는 것을 막을 수 있게 된다.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package algostudy2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_bj_16432_떡장수와호랑이 {
static int N;
static boolean[][] graph;
static int[] result;
static boolean find;
static boolean[][] visit;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
N = Integer.parseInt(br.readLine());
graph = new boolean[N][10];
result = new int[N];
visit = new boolean[N][10]; //N번째 날에 i번의 떡을 가지는 경우를 체크
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
for (int n = 0; n < num; n++) {
graph[i][Integer.parseInt(st.nextToken())] = true;
}
}
find = false;
dfs(0, -1);
StringBuilder sb = new StringBuilder();
if (find) {
for (int i = 0; i < N; i++) {
sb.append(result[i] + " ");
}
System.out.println(sb.toString());
} else {
System.out.println(-1);
}
}
static void dfs(int depth, int previousNum) {
if (find == true) {
return;
}
if (depth == N) {
find = true;
return;
}
for (int i = 1; i <= 9; i++) {
if (graph[depth][i] == true && i != previousNum && visit[depth][i] == false && find == false) {
result[depth] = i;
visit[depth][i] = true;
dfs(depth + 1, i);
}
}
}
}
|
반응형
'Algorithm' 카테고리의 다른 글
[BOJ] 9935. 문자열 폭발 (0) | 2021.07.13 |
---|---|
[BOJ] 16438. 원숭이 스포츠 (0) | 2021.07.09 |
[BOJ] 1967. 트리의 지름 (0) | 2021.07.02 |
[BOJ] 16437. 양 구출 작전 (0) | 2021.07.02 |
[BOJ] 1507. 궁금한 민호 (0) | 2021.06.24 |