drop-of-water

문제 링크

조건

  • k점 과녁에 한발이라도 더 많은 화살을 맞힌 선수가 k점을 가져감
  • k점 과녁에 아무도 화살을 맞히지 못하면 어느 누구도 k점을 가져가지 않음

입력값

  • info = 어피치가 맞힌 과녁 점수의 개수 (index 0 = 10점, … , index 10 = 0점) (배열)
  • n = 라이언이 쏠 수 있는 화살의 개수

출력값

  • 어떤 과녁 점수에 n 발의 화살을 맞춰야 하는지 10점부터 0점 까지 순서대로 배열에 담아 출력 (index 0 = 10점, … , index 10 = 0점)
  • 모든 경우의 수를 확인 한 후에도 라이언과 어피치의 점수차가 같거나 어피치가 높은 경우 [-1] return
  • 라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 return

풀이과정

  • 낮은 점수를 더 맞힌 경우를 찾아야 하기 때문에 index 10 부터 0 까지 돌아야함
  • 남은 화살이 없는 경우 그냥 return
  • 10점까지 다 쐈는데 라이언 점수가 어치피 점수보다 높은 경우 남은 화살 0점에 쏘고 점수판 업데이트
  • 쏠 화살이 남은 경우 현재 점수판에서 어피치가 맞춘 화살보다 1개 더 많은 화살 개수를 라이언이 쏴야함
  • 라이언이 쏠 남은 화살이 없는 경우 어치피가 맞힌 과녁의 화살 개수가 1개 이상인 경우 어피치가 점수를 가져가고 어피치가 맞힌 과녁의 개수가 없으면 아무도 점수를 가져가지 않음
  • 모든 경우의 수를 확인 한 후에도 라이언과 어피치의 점수차가 같거나 어피치가 높은 경우 [-1] return

코드

function solution(n, info) {
  let result = new Array(11).fill(0);
  let max = 0;

  function solve(rScore, pScore, shootCounter, point, scoreBoard) {
    if (shootCounter > n) {
      return;
    } else if (point > 10) {
      let scoreDiff = rScore - pScore;

      // 라이언이 가장 큰 점수 차이로 우승할 수 있는 방법이 여러 가지일 경우, 가장 낮은 점수를 더 많이 맞힌 경우를 scoreBoard에 넣음
      if (scoreDiff > max) {
        scoreBoard[10] = n - shootCounter;
        max = scoreDiff;
        result = scoreBoard;
      }

      return;
    } else if (shootCounter < n) {
      let scoreBoardCopy = [...scoreBoard];
      // k점 과녁에 한발이라도 더 많은 화살을 맞힌 선수가 k점을 가져감
      scoreBoardCopy[10 - point] = info[10 - point] + 1;
      solve(rScore + point, pScore, shootCounter + info[10 - point] + 1, point + 1, scoreBoardCopy);
    }

    // k점 과녁에 한발이라도 더 많은 화살을 맞힌 선수가 k점을 가져감
    if (info[10 - point] > 0) {
      solve(rScore, pScore + point, shootCounter, point + 1, scoreBoard);
    }
    // k점 과녁에 아무도 화살을 맞히지 못하면 어느 누구도 k점을 가져가지 않음
    else {
      solve(rScore, pScore, shootCounter, point + 1, scoreBoard);
    }
  }

  solve(0, 0, 0, 0, result);

  // 모든 경우의 수를 확인 한 후에도 라이언과 어피치의 점수차가 같거나 어피치가 높은 경우 [-1] return
  if (max <= 0) return [-1];
  else return result;
}

😊