❗ 문제 설명
❗ 입출력 예
❗ 문제 풀이
apeachCount: 어피치가 얻은 점수
ryanCount: 라이언이 얻은 점수
usedShotCount: 현재 라이언이 쏜 화살 수
point: 지금 몇점을 기준으로 하고 있는지
arr: 라이언이 쏜 점수 배열
1) point>10이라면 => point가 0부터 10까지 다 순회하고 왔다면 아래과정을 시행
라이언의 점수와 어피치 점수 차를 구합니다.
이 차이가 최대 차이보다 크다면 최대차이를 변경해줍니다.
또한 마지막에 배열에 아직 쏘지 않고 남은 값을 추가해줍니다.
answer은 arr로 변경해줍니다.
2) 라이언이 이기는 경우
새로운 배열을 따로 만들고, 거기에 어피치 점수에 해당하는 값에 1만큼 높은 값으로 변경해주고 그 값을 함수에 다시 넣어줍니다.
그대로, 라이언이 점수획득, 어피치가 그 point에 해당하는 영역에 쏜 것보다 1만큼 많이 쏩니다.
라이언 점수 획득하고 다음 포인터로 이동
3) 어피치가 이기는 경우
단, 어피치가 맞힌 과녁의 화살의 수가 0이 아니여야 합니다. 재귀 실행
인자: apeachCount+point,ryanCount,usedShotCount,point+1,arr
-> 어피치에 점수 추가하고 다음 포인터로 이동
4) 둘다 점수를 얻지 못한 경우 => 둘다 0점인 경우
다음 포인터로 이동하는 재귀 실행
위의 함수에 초기값 0,0,0,0,answer을 넣어줌으로써 answer을 구합니다.
단, 여기서 maxDif가 한번도 바뀌지 않은 초기값 0이라면 [-1]을 리턴해줍니다.
아니라면 answer을 리턴해줍니다.
❗ 주의사항
✍ 코드
function solution(n, info) {
//라이언이 어떻게 쏠지에 대한 answer 배열
let answer= new Array(11).fill(0);
let maxDif = 0;
function shootRyan(apeachCount,ryanCount, usedShotCount, point, arr){
// 화살수가 이미 n을 넘었다면 패스
if(n<usedShotCount)return;
// 한바퀴를 돌았다면 값들을 체크
if(point>10){
// 라이언과 어피치의 점수의 차를 구함.
let dif = ryanCount - apeachCount;
// max보다 크다면 최댓값이므로 최댓갑 변경
if(maxDif<dif){
//아직 못쏜 값은 마지막에 쏜다.
arr[10] = n-usedShotCount;
maxDif = dif;
answer = arr;
}
return;
}
//라이언이 이길때
if(n>usedShotCount){
// 기존 arr을 받음
let current = [...arr];
// point에 해당하는 배열에 인덱스를 1추가
current[10 - point] = info[10-point] + 1;
// 라이언이 10-point번째 점수를 얻기 위해선 info에 해당하는 값보다 1은 커야 됨.
shootRyan(apeachCount,ryanCount + point, usedShotCount + info[10-point] + 1, point+1,current);
};
// current배열이 아닌 arr 배열을 인수로 전달함으로써, 마지막에 쐈던 화살을 없던 것처럼 처리함
//어피치가 이기는 경우
if(info[10-point]>0){
// 어피치 점수에 point만큼을 더해주고 다음 포인터로 이동
shootRyan(apeachCount+point,ryanCount,usedShotCount,point+1,arr);
}
else{
//둘다 점수를 못얻는 상황: 둘다 0,0 번씩 쏜 경우는 다음 point로만 이동
shootRyan(apeachCount,ryanCount,usedShotCount,point+1,arr);
}
}
shootRyan(0,0,0,0,answer);
if(maxDif===0){
return [-1];
}
else{
return answer;
}
}
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ]
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 ]
[ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ]
[ 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ]
[ 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 ]
[ 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1 ]
과녁의 점수가 낮은 순서대로 먼저 화살을 다 쏜 뒤에 어피치의 점수와 라이언의 점수의 차를 구하고 완전탐색을 통해 모든 화살을 다 움직여서 점수 차의 최댓값을 구합니다.