알고리즘
[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);
}