[프로그래머스] 양궁대회 - javascript

김지원·2022년 2월 5일
0

coding-test

목록 보기
16/25
post-thumbnail
post-custom-banner

📖 문제링크

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

profile
backend-developer
post-custom-banner

0개의 댓글