https://school.programmers.co.kr/learn/courses/30/lessons/92342
화살 n발을 다 쏜 후에 라이언이 화살 n발을 쏩니다.더 많은 화살을 k점에 맞힌 선수가 k 점을 가져갑니다a = b일 경우는 어피치가 k점을 가져갑니다.a = b = 0 인 경우, 즉, 라이언과 어피치 모두 k점에 단 하나의 화살도 맞히지 못한 경우는 어느 누구도 k점을 가져가지 않습니다.배열의 길이가 11이고
2개의 경우만 존재하기에 완전탐색을 사용해서 문제를 풀 수 있습니다.
const newArr = [...arr];
// ryan이 점수를 가져감
if (rest >= info[idx] + 1) {
const newArr = [...arr];
newArr[idx] = info[idx] + 1;
dfs(idx + 1, rest - newArr[idx], apeach, ryan + (10 - idx), newArr);
}
// apeach가 점수를 가져감
const newArr2 = [...arr];
newArr2[idx] = 0;
dfs(idx + 1, rest, apeach + (info[idx] > 0 ? (10 - idx) : 0), ryan, newArr2);
4-1을 비교해서 답을 정한다.if (idx === 11) {
const newArr = [...arr];
if (rest) newArr[10] += rest;
const diff = ryan - apeach;
if (diff <= 0) return;
if (diff > max) {
max = diff
answer = newArr;
} else if (diff === max) {
for (let i = 10; i >= 0; i--) {
if (newArr[i] > answer[i]) {
answer = newArr;
break;
} else if (newArr[i] < answer[i]) break;
}
}
return;
}
function solution(n, info) {
let max = -1;
let answer = [-1];
const dfs = (idx, rest, apeach, ryan, arr) => {
if (idx === 11) {
const newArr = [...arr];
if (rest) newArr[10] += rest;
const diff = ryan - apeach;
if (diff <= 0) return;
if (diff > max) {
max = diff
answer = newArr;
} else if (diff === max) {
for (let i = 10; i >= 0; i--) {
if (newArr[i] > answer[i]) {
answer = newArr;
break;
} else if (newArr[i] < answer[i]) break;
}
}
return;
}
const newArr = [...arr];
// ryan이 점수를 가져감
if (rest >= info[idx] + 1) {
const newArr = [...arr];
newArr[idx] = info[idx] + 1;
dfs(idx + 1, rest - newArr[idx], apeach, ryan + (10 - idx), newArr);
}
// apeach가 점수를 가져감
const newArr2 = [...arr];
newArr2[idx] = 0;
dfs(idx + 1, rest, apeach + (info[idx] > 0 ? (10 - idx) : 0), ryan, newArr2);
}
dfs(0, n, 0, 0, Array(11).fill(0));
return answer;
}