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

2022. 1. 18. 23:57
반응형

문제만 언급하고 제한사항이나 입출력 예시는 생략할 것이다.

문제

  1. 어피치가 화살 n발을 다 쏜 후에 라이언이 화살 n발을 쏩니다.
  2. 점수를 계산합니다.
    1. 만약, k점을 어피치가 a발을 맞혔고 라이언이 b발을 맞혔을 경우 더 많은 화살을 k점에 맞힌 선수가 k점을 가져갑니다. 단, a = b일 경우는 어피치가 k점을 가져갑니다. 또한 a = b = 0인 경우, 즉, 라이언과 어피치 모두 k점에 단 하나의 화살도 맞히지 못한 경우는 어느 누구도 k점을 가져가지 않습니다.
      ex) 어치피가 10점을 2발 맞혔고 라이언도 10점을 2발 맞혔을 경우 어피치가 10점을 가져갑니다.
      ex) 어피치가 10점을 1발 맞혔고 라이언은 10점을 2발 맞혔을 경우 라이언이 10점을 가져갑니다.
    2. 모든 과녁 점수에 대해 각 선수의 최종 점수를 계산합니다.
  3. 최종 점수가 더 높은 선수를 우승자로 결정합니다. 단, 최종 점수가 같은 경우 어피치를 우승자로 결정합니다.

현재 상황은 어피치가 화살 n발을 다 쏜 후이고 라이언이 쏠 차례입니다. 라이언이 어피치를 가장 큰 점수차이로 이기기 위해서 n발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 구하려고 합니다. 매개변수로는 화살의 개수를 담은 자연수 n, 어피치가 맞힌 과녁 점수의 개수를 10점부터 0점가지 순서대로 담은 정수 배열 info가 주어집니다.

풀이

라이언이 각 점수에 대한 과녁을 맞추거나 안맞추거나 둘중에 하나를 하는 로직으로 문제를 풀 수 있다.

라이언은 어피치가 쏜 갯수의 +1 만큼 더 맞추거나 안맞추거나 해야한다.

어피치보다 하나 더 맞추는 모든 경우를 가장 낮은 점수부터 시작해서 둘의 점수차를 구해서 최댓값을 계속 갱신 시켜주고, 최댓값이 갱신 되면 ryonInfo가 그에 맞게 바뀌기 때문에 모든 재귀가 완료되면 결국 라이언이 최대 점수차로 이기는 경우의 배열이 만들어 질 것이다.

function solution(n, info) {
  let maxDiff = 0;
  let ryonInfo = Array(11).fill(0);
  
  const shot = (peachScore, ryonScore, count, idx, board) => {
    if(n < count) return
    if(idx > 10){
      let diff = ryonScore - peachScore;
      if(diff > maxDiff){
        board[10] = n - count;
        maxDiff = diff
        ryonInfo = board;
      }
      return;
    }
    if(n > count) {
      let board2 = [...board];
      board2[10 - idx] = info[10 - idx] + 1;
      shot(peachScore, ryonScore + idx, count + info[10 - idx] + 1, idx + 1, board2);
    }
    
    if(info[10 - idx] > 0){
      shot(peachScore + idx, ryonScore, count, idx + 1, board)
    } else {
      shot(peachScore, ryonScore, count, idx + 1, board)
    }
  }
  shot(0, 0, 0, 0, ryonInfo)
  
  if(maxDiff <= 0) return [-1];
  else return ryonInfo;
}
반응형
LIST

BELATED ARTICLES

more