forked from onlybooks/java-algorithm-interview
-
Notifications
You must be signed in to change notification settings - Fork 0
/
P99_1.java
63 lines (56 loc) · 2.1 KB
/
P99_1.java
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
package ch24;
import java.util.Arrays;
public class P99_1 {
int maxScore = 0;
int[] info; // 불필요한 파라미터 전달을 없애기 위해 멤버 변수 선언
int[] answer = new int[11];
// 점수 차이 계산
public int calcScore(int[] lion) {
int diff = 0;
for (int i = 0; i <= 10; i++) {
if (lion[i] == 0 && info[i] == 0)
continue;
diff = (lion[i] > info[i]) ?
diff + (10 - i) : diff - (10 - i);
}
return diff;
}
public void dfs(int index, int[] lion, int arrow) {
// 최종 인덱스 도달 시 결과 처리
if (index == 11) {
lion[10] = arrow; // 화살이 남아 있다면 모두 10번 인덱스(점수 0)에 부여
// 점수 차이 계산
int score = calcScore(lion);
// 기존 최고 점수 차이를 능가하는 경우 교체
if (score > maxScore) {
maxScore = score;
answer = Arrays.copyOf(lion, lion.length);
} else if (score == maxScore) { // 점수 차이가 같은 경우
for (int i = 10; i >= 0; i--) {
if (lion[i] == answer[i])
continue;
// 뒤에서부터 더 많이 맞힌 경우 정답 교체
if (lion[i] > answer[i])
answer = Arrays.copyOf(lion, lion.length);
break;
}
}
return;
}
// 어피치보다 화살+1 또는 0 둘 중 하나로 DFS 진행
if (info[index] < arrow) {
lion[index] = info[index] + 1;
dfs(index + 1, lion, arrow - lion[index]);
lion[index] = 0;
}
dfs(index + 1, lion, arrow);
}
public int[] solution(int n, int[] info) {
this.info = info; // 각종 메소드에서 활용하기 위해 멤버 변수에 할당
dfs(0, new int[11], n);
// 정답이 없으면 -1 리턴
if (maxScore == 0)
return new int[]{-1};
return answer;
}
}