알고리즘

[JavaScript] 프로그래머스 - 코딩 테스트 공부

J3SUNG 2023. 2. 22. 22:43
728x90

2022 KAKAO TECH INTERNSHIP

모든 문제를 풀 수 있는 알고력과 코딩력을 가지는데 걸리는 시간을 구하는 문제입니다.

1의 시간을 이용하면 알고력을 1 올릴 수 있습니다.
1의 시간을 이용하면 코딩력을 1 올릴 수 있습니다.
알고력a와 코딩력b가 이상일때 해당 문제를 t시간 동안 풀면 알고력과 코딩력이 c, d 올라갑니다.

위의 3가지중 한개를 할 수 있습니다. 
 DFS방식으로 3가지의 경우를 탐색하고 알고력과 코딩력이 최대치를 넘어가면 최대치로 고정해주었습니다.
2차원 visit배열을 사용해서 visit[알고력][코딩력]에 기록을 하고
더 작은 값이 들어오면 갱신을 해주고 큰 값인 경우 더 이상 탐색하지 않게 해주었습니다.
최종적으로 찾는 알고력 코딩력을 넘어가면 최종 알고력, 최종 코딩력으로 변경해주어서 처리를 했습니다.

let targetAlp = 0;
let targetCop = 0;
let visit = [];
function solution(alp, cop, problems) {
    let answer = 0;
    for(let i=0; i<problems.length; ++i){
        targetAlp = Math.max(targetAlp, problems[i][0]);
        targetCop = Math.max(targetCop, problems[i][1]);
    }
    for(let i=0; i<151; ++i){
        let temp = [];
        for(let j=0; j<151; ++j){
            temp.push(987654321);
        }
        visit.push(temp);
    }
    DFS(alp, cop, 0, problems);
    answer = visit[targetAlp][targetCop];
    return answer;
}
function DFS(a, c, cnt, problems) {
    if(targetAlp < a){
        a = targetAlp;
    }
    if(targetCop < c){
        c = targetCop;
    }
    if(visit[a][c] <= cnt){
        return;
    }
    visit[a][c] = Math.min(visit[a][c], cnt);
    if(a === targetAlp && c === targetCop){
        return;
    }
    for(let i=0; i<problems.length; ++i){
        if(a >= problems[i][0] && c >= problems[i][1]){
            let nextAlp = a+problems[i][2];
            let nextCop = c+problems[i][3];
            DFS(nextAlp, nextCop, cnt+problems[i][4], problems);
        }
    }
    DFS(a+1, c, cnt+1, problems);
    DFS(a, c+1, cnt+1, problems);    
}