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
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 석유 시추 (0) | 2024.09.12 |
---|---|
[JS] 순위 검색 (0) | 2024.09.11 |
[JS] 혼자서 하는 틱택토 (1) | 2024.09.06 |
[JS] 혼자 놀기의 달인 (0) | 2024.09.05 |
[JS] 이모티콘 할인행사 (3) | 2024.09.02 |