코테 및 알고리즘
프로그래머스 - 피로도
Jay_Jung
2024. 6. 30. 14:20
<문제>
https://school.programmers.co.kr/learn/courses/30/lessons/87946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
<문제 핵심>
1. 완전 탐색
✅ dungeons배열에 있는 요소들을 차례대로 가는 것이 아닌 모든 요소들을 탐색하면서 유저가 탐험할 수 있는 최대 던전 수를 구하는 문제이다. dfs와 백트래킹 알고리즘을 활용하여 모든 조합을 만들고 answer에 추가하여 제일 큰 숫자를 출력하면 된다. dfs 함수 로직을 짜는 과정에서 호출할 때 인자 2개를 활용하여 호출하는 것이 핵심이였다.
<문제 풀이과정 및 순서도>
1. dfs(0, k)를 호출한다. 0은 count를 의미하고 k는 현재 사용자의 피로도를 의미한다.
2. dfs함수를 구현하는데 백트래킹 알고리즘을 활용하여 유저가 탐험할 수 있는 최대 던전 수를 구한다.
✅ 이번에는 forEach 메소드를 이용하여 solution함수 매개변수에 있는 dungeons배열을 순회하고 백 트래킹 알고리즘을 활용해봤다.
✅ 두 번째 던전까지는 조건을 만족하는데 세 번째 던전에서 조건이 불만족되면? 다시 두 번째 던전으로 돌아가서 탐색해야 하니까 visited[index] = false를 통해 돌아갈 수 있는 환경 마련해주기
3. answer배열에서 가장 큰 요소를 구한다. -> Math.max(...answer)
function solution(k, dungeons) {
let answer = [];
let dungeonsCount = dungeons.length;
let visited = Array(dungeonsCount).fill(false);
//3개의 배열이 담겨져있음
const dfs = (count, k) => {
answer.push(count);
dungeons.forEach((dungeon, index) => {
let [minStamina, useStamina] = dungeon;
if(k >= minStamina && !visited[index]) {
visited[index] = true;
dfs(count + 1, k - useStamina)
visited[index] = false;
}
});
}
//dfs 함수 로직에서 에러가 남
dfs(0, k);
return Math.max(...answer);
}