끄적끄적 코딩
article thumbnail
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;
}

검색 태그