|
| 1 | +// https://school.programmers.co.kr/learn/courses/30/lessons/92342 |
| 2 | +// 핵심은 1. 각 점수에 대해 이길지 말지를 결정하는 것 |
| 3 | +// 2. 이길 때, 최소한의 화살 사용하기 - 어피치보다 1개만 더 쏘면됨. => 최고점수 만들기 위해 화살 효율적 사용, 그리고 낮은점수를 많이 맞추는게 우선되므로 |
| 4 | + |
| 5 | +function solution(n, info) { |
| 6 | + let maxDiff = 0 |
| 7 | + let answer = [-1] |
| 8 | + let lion = Array(11).fill(0) |
| 9 | + |
| 10 | + // level은 현재 검사 중인 점수(0부터 시작), count는 남은 화살 수 |
| 11 | + function dfs(level, count) { |
| 12 | + if (level == 10) { |
| 13 | + lion[level] = count // 남은 화살은 모두 0점에 사용 |
| 14 | + |
| 15 | + let sum = 0 |
| 16 | + for (let i = 0; i < 10; i++) { |
| 17 | + if (lion[i] > info[i]) { |
| 18 | + // 라이언이 점수 획득 |
| 19 | + sum = sum + (10 - i) |
| 20 | + } else if (lion[i] === info[i] && lion[i] === 0) { |
| 21 | + // 둘다 점수획득 못함 |
| 22 | + continue |
| 23 | + } else if (lion[i] === info[i] || lion[i] < info[i]) { |
| 24 | + // 어피치가 점수 획득 |
| 25 | + if (info[i] > 0) sum = sum - (10 - i) |
| 26 | + } |
| 27 | + } |
| 28 | + |
| 29 | + if (sum > maxDiff) { |
| 30 | + maxDiff = sum |
| 31 | + answer = [...lion] |
| 32 | + } else if (sum == maxDiff && sum > 0) { |
| 33 | + // 점수차가 같으면 낮은 점수를 더 많이 맞힌 경우를 선택 |
| 34 | + // 낮은 점수부터 비교 |
| 35 | + for (let j = 10; j >= 0; j--) { |
| 36 | + if (answer[j] == lion[j]) { |
| 37 | + continue |
| 38 | + } else if (lion[j] > answer[j]) { |
| 39 | + answer = [...lion] |
| 40 | + break |
| 41 | + } else { |
| 42 | + break |
| 43 | + } |
| 44 | + } |
| 45 | + } |
| 46 | + return |
| 47 | + } |
| 48 | + |
| 49 | + // 1. 현재 점수는 포기하는 경우 (화살 0개 사용) |
| 50 | + dfs(level + 1, count) |
| 51 | + |
| 52 | + // 2. 현재 점수에서 이기는 경우 (남은화살 있고, 어피치보다 1개 더 사용) |
| 53 | + const neededArrows = info[level] + 1 |
| 54 | + if (count >= neededArrows) { |
| 55 | + lion[level] = neededArrows |
| 56 | + dfs(level + 1, count - neededArrows) |
| 57 | + lion[level] = 0 // 백트래킹 초기화 |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + dfs(0, n) |
| 62 | + |
| 63 | + return maxDiff <= 0 ? [-1] : answer |
| 64 | +} |
0 commit comments