티스토리 뷰
문제가 참 완탐스럽게 생겼다
처음에는 그리디로 쭉 보는건가 싶었는데
하다보니.. 그냥 편하게 백트래킹으로 풀었따
모든경우의 수 중에서 가지치기를 하면서 보면 시간안에 빠르게 들어온다
먼저 총 15가지의 라운드가 있고 각 라운드는 3가지의 경우의 수가 가능하다
그래서 3^15의 경우의 수가 있다
이 중에서 우리는 4개의 입력으로 받은 조건들을 만족하는 경우를 찾아야 한다
그래서 입력조건을 벗어나는 경우는 적절하게 가지치기를 해줘야한다
나의 경우는 order라는 배열에 일단 15라운드의 prev VS next를 다 저장했다
ex) [A,B],[A,C],[A,D]...[E,F]
그 후 order배열에 0(prev 승),1(무),2(prev 패)를 넣어보면 된다
그러게 status라는 배열에 현재 라운드의 결과를 저장하고
만약 입력받은 결과를 만족시킬 수 있다면 다음 라운드로 넘어가고
아니라면 넘어가지 않는다
문제 자체는 쉬운데 구현하는게 좀 더러웠다...
소스코드
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
67
68
69
70
71
|
public class Main {
public static int[][][] arr = new int[4][6][3];
public static int[][] status = new int[6][3];;
public static int[] answer= new int[4];
public static int[][] order = new int[15][2];
public static int[] temp = new int[15];
public static void answerCheck() {
for(int i=0;i<4;i++) {
boolean check=true;
for(int j=0;j<6;j++) {
for(int k=0;k<3;k++) {
if(arr[i][j][k] != status[j][k]) check=false;
}
}
if(check) answer[i]=1;
}
}
public static void solve(int pos) {
if(pos==15) {
answerCheck(); return;
}
int prev = order[pos][0];
int next = order[pos][1];
for(int i=0;i<3;i++) {
status[prev][i]++;
status[next][2-i]++;
int cnt=0;
for(int j=0;j<4;j++) {
boolean can=true;
for(int k=0;k<3;k++) {
if(status[prev][k]>arr[j][prev][k] || status[next][k]>arr[j][next][k]) can=false;
}
if(can) cnt++;
}
if(cnt!=0) solve(pos+1);
status[prev][i]--;
status[next][2-i]--;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=0;i<12;i++) {
if(i<5) order[i][1]=i+1;
else if(i<9) {
order[i][0]=1;
order[i][1]=i-3;
} else {
order[i][0]=2;
order[i][1]=i-6;
}
}
order[12][0]=order[13][0]=3;
order[12][1]=order[14][0]=4;
order[13][1]=order[14][1]=5;
for(int i=0;i<4;i++) {
for(int j=0;j<6;j++) {
for(int k=0;k<3;k++) {
arr[i][j][k]=sc.nextInt();
}
}
}
solve(0);
for(int i=0;i<4;i++) System.out.print(answer[i]+" ");
}
}
|
'알고리즘 > Java' 카테고리의 다른 글
[SWEA] 4050 재관이의 대량 할인 (0) | 2020.04.29 |
---|---|
[백준] 16234 인구이동 (0) | 2020.04.24 |
[SWEA] 9659 다항식 계산 (0) | 2020.04.03 |
[SWEA] 1244 최대상금 (0) | 2020.02.17 |
[JUNGOL] 1828 냉장고 (0) | 2020.02.12 |
댓글