728x90
2022 KAKAO BLIND RECRUITMENT
라이언이 어피치를 이겼을 때의 점수 배열을 구하는 문제입니다.
라이언이 질 경우 -1을 이기는 경우가 여러 방법이 있다면 낮은 점수를 더 많이 맞힌 경우를 출력합니다.
과녁에 라이언과 어피치가 점수가 동일하다면 어피치가 이기므로 어피치의 점수 +1의 화살을 가지고 있다면
해당 과녁에서 승리할 수 있다고 볼 수 있습니다.
라이언이 가지고 있는 화살을 통해서 가능한 승리의 경우에 대해서 모두 탐색한 후에
이긴다면 낮은 점수를 더 많이 맞힌 경우를 출력해주었습니다.
function solution(n, info) {
let ans = [-1];
let answer = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
let aScore = 0;
let bScore = 0;
let max = 0;
for(let i=0; i<10; ++i){
bScore += info[i] > 0 ? 10-i : 0;
}
for(let i=0; i<=10; ++i){
if(info[i] < n){
DFS(i, n-info[i]-1, info[i], 10-i, (info[i] > 0 ? bScore-(10-i) : bScore));
}
}
function DFS(index, value, sub, aScore, bScore) {
answer[index] = sub+1;
for(let i=index + 1; i<=10; ++i){
if(info[i] < value){
DFS(i, value-info[i]-1, info[i], aScore+(10-i), (info[i] > 0 ? bScore-(10-i) : bScore));
}
if(index === 10) {
answer[10] += value;
value = 0;
}
}
answer[10] = value;
let chk = false;
if(max === aScore-bScore){
for(let i=0; i<=10; ++i){
if(ans[10-i] < answer[10-i]){
chk = true;
break;
} else if (ans[10-i] > answer[10-i]){
break;
}
}
}
if(max < aScore-bScore || chk){
max = aScore-bScore;
for(let i=0; i<=10; ++i){
ans[i] = answer[i];
}
}
max = Math.max(max, aScore - bScore);
if(max === 0){
ans = [-1];
}
answer[index] = 0;
}
return ans;
}
'알고리즘' 카테고리의 다른 글
[JavaScript] 프로그래머스 - k진수에서 소수 개수 구하기 (0) | 2023.02.28 |
---|---|
[JavaScript] 프로그래머스 - 주차 요금 계산 (0) | 2023.02.28 |
[Java] 백준 2567번 색종이 - 2 (0) | 2023.02.27 |
[Java] 백준 10026번 적록색약 (1) | 2023.02.25 |
[Java] 백준 1987번 알파벳 (0) | 2023.02.25 |