😊
양궁대회
March 28, 2022
문제 링크
조건
- 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;
}
😊