https://programmers.co.kr/learn/courses/30/lessons/92342
문제 설명은 길기 때문에 링크로 대신해야할 것 같다.
필자가 푼 문제풀이
function solution(n, info) {
let result = Array.from({length: 11}, () => 0);
let max = 0;
function shot (peachScore, ryanScore, count, idx, scoreBoard) {
if (n < count) return;
if (idx > 10) {
let scoreDiff = ryanScore - peachScore;
if (max < scoreDiff) {
scoreBoard[10] = n - count;
max = scoreDiff;
result = scoreBoard;
}
return;
}
if (n > count) {
let candidate = [...scoreBoard];
candidate[10 - idx] = info[10 - idx] + 1;
shot(peachScore, ryanScore + idx, count + info[10 - idx] + 1, idx + 1, candidate);
}
if (info[10 - idx] > 0) {
shot(peachScore + idx, ryanScore, count, idx + 1, scoreBoard);
} else {
shot (peachScore, ryanScore, count, idx + 1, scoreBoard);
}
}
shot(0, 0, 0, 0, result);
if (max <= 0) return [-1]
else return result;
}
이 문제는 재귀함수를 이용한 문제였다.
핵심은 ryan이 peach보다 효율성있게 많이 맞춰야되기때문에 +1만 한다는것
그리고 조건에 있는 라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지 일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 return 해주세요.
이 문장을 통해 점수가 낮은 것부터 넣어가면서 비교해야된다는 것을 알 수 있다.
차례대로 조건에 맞게 구현하였다.
if (n < count) return;
n 보다 count가 높아지면 재귀를 멈춘다.
if (idx > 10) {
let scoreDiff = ryanScore - peachScore;
if (max < scoreDiff) {
scoreBoard[10] = n - count;
max = scoreDiff;
result = scoreBoard;
}
return;
}
index가 10이상되면 10점까지 다 파악한 것이기 때문에 거기서 전역변수인 max(가장 큰 차이의 점수)와 비교하여 result에 scoreBoard를 넣었다.
그리고 0점에 나머지 남은 화살 수를 넣었다.
⭐ 여기서 주의할 점은 배열안에 값을 넣는 것이 아니기 때문에 result는 let으로 지정하였다.
if (n > count) {
let candidate = [...scoreBoard];
candidate[10 - idx] = info[10 - idx] + 1;
shot(peachScore, ryanScore + idx, count + info[10 - idx] + 1, idx + 1, candidate);
}
본격적인 재귀다.
scoreBoard를 값에 그대로 넣게 되면 값이 중복되어 들어가기 때문에 새로운 배열에 값을 넣어주었다.
그리고 peach가 쏜 화살보다 1개 더 추가하여 값을 넣어주었다.
if (info[10 - idx] > 0) {
shot(peachScore + idx, ryanScore, count, idx + 1, scoreBoard);
} else {
shot (peachScore, ryanScore, count, idx + 1, scoreBoard);
}
위의 재귀에서 ryan 화살에 대한 재귀를 마쳤으니 peach에 대한 점수를 구한다.
2022.02.05