코딩 테스트/프로그래머스 코딩 테스트 연습
[JS] 양궁대회
58청춘
2024. 9. 9. 23:54
728x90
문제
풀이
완전 탐색으로 라이언이 쏠 수 있는 모든 조합을 구했다. 구한 조합을 이용해 피치가 쏜 결과와 비교하며 최종 점수 차이를 계산해야 한다.
이때 얻은 점수 차이를 이용해 결과를 도출해야 하는데, 주의해야할 점들이 몇가지 있다.
첫 번째로 피치가 더 많은 점수를 얻거나 동점이면 피치의 승리이다. 두 번째, 라이언이 더 많은 점수를 얻는 조합 중 가장 낮은 점수를 더 많이 맞힌 경우를 리턴해야한다.
나는 두 번째 경우를 구현하는 것을 잊고 재출했다가 틀린 경험을 했다......
코드
const getComb = (arr, n, depth, sum) => {
const result = [];
if (depth === 10) return [[...arr, n - sum]];
for (let i = 0; i <= n - sum; i++) {
if (i + sum > n) break;
const temp = getComb([...arr, i], n, depth + 1, sum + i);
result.push(...temp);
}
return result;
};
const checkScore = (pArr, lArr) => {
let pS = 0;
let lS = 0;
for (let i = 0; i < pArr.length; i++) {
if (pArr[i] === 0 && lArr[i] === 0) continue;
if (pArr[i] >= lArr[i]) pS += (10 - i);
else lS += (10 - i);
}
return lS - pS;
};
const getLastNonZero = (arr) => {
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] !== 0) return i;
}
return null;
};
const solution = (n, info) => {
let answer = [];
let sub = 0;
const test = getComb([], n, 0, 0);
for (let i = 0; i < test.length; i++) {
const scoreSub = checkScore(info, test[i]);
if (scoreSub <= 0) continue;
if (scoreSub > sub) {
answer = test[i];
sub = scoreSub;
}
else if (scoreSub === sub) {
const pN = getLastNonZero(answer);
const nN = getLastNonZero(test[i]);
if (pN < nN) answer = test[i];
else if (pN === nN && answer[pN] < test[i][nN]) answer = test[i];
}
}
return answer.length > 0 ? answer : [-1];
};
728x90