📝 문제
프로그래머스 - 양궁대회 (2단계)
📝 풀이
📌 작성 코드
var answer = [-1];
var apeachInfo, count, maxScore;
function solution(n, info) {
//전역변수로 넘기기 위해서 밖에 선언하고, 안에서 값 할당
apeachInfo = info;
count = n;
maxScore = 0;
//함수 호출
func(Array(11).fill(0), 0, 0, 0, 0);
//정답 리턴
return answer;
}
//매개변수 : 만들고 있는 배열, 위치, 화살 수, 어피치 점수, 라이언 점수
function func(list, index, arrow, apeach, rion) {
//만약 위치가 10이라면 (10일 경우 화살은 0점일 경우를 뜻함)
if (index == 10) {
//일단 화살 수를 맞춰야 하기 때문에 남은 화살은 0점에 몰아주기
if (arrow < count) list[10] = count - arrow;
//라이언의 점수가 어피치의 점수보다 크고, 현재 기준 가장 차이가 많이 나는 점수보다 크거나 같을 때
if (rion-apeach > 0 && rion-apeach >= maxScore) {
//만약 가장 차이가 많이 나는 경우는 그냥 바로 answer과 maxScore 할당
if (rion-apeach > maxScore) {
answer = list.slice();
maxScore = rion-apeach;
} else { //그렇지 않으면
if (answer.length == 1) answer = Array(11).fill(0);
//0점부터 비교해서 낮은 점수를 많이 쏜 것으로 할당
for (var i = 10; i >= 0; i--) {
if (list[i] > answer[i]) {
answer = list.slice();
maxScore = rion-apeach;
break;
} else if (list[i] < answer[i]) {
break;
}
}
}
}
return;
}
//list에 그대로 입력하면 값이 변동되기 때문에 새로운 배열 생성 수 list를 깊은 복사로 할당
var nextList = list.slice();
//현 위치의 화살은 어피치가 쏜 화살보다 1개 더 많게 설정
nextList[index] = apeachInfo[index] + 1;
//만약 쏜 화살 수가 쏴야할 화살보다 작거나 같으면 라이언이 점수를 얻는 식으로 해서 함수 호출
if (arrow + nextList[index] <= count) func(nextList, index+1, arrow + nextList[index], apeach, rion+10-index);
//라이언이 점수를 얻지 않는 경우도 호출
func(list, index+1, arrow, apeachInfo[index] == 0 ? apeach : apeach+10-index, rion);
}
📌 결과