문제
이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다. 각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.)
입력설명
첫 번째 줄에 문제의 개수N(1<=N<=20)과 제한 시간 M(10<=M<=300)이 주어집니다.
두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다.
출력설명
첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력합니다.
입력예제
5 20
10 5
25 12
15 8
6 3
7 4
//출력 : 41
풀이
function solution(m, ps, pt){
let n = ps.length;
let max = Number.MIN_SAFE_INTEGER;
function DFS(L,sumTime,sum){
if(sumTime>m) return;
if(L===n){
max = Math.max(sum,max);
}
else{
DFS(L+1,sumTime+pt[L],sum+ps[L]);
DFS(L+1,sumTime,sum);
}
}
DFS(0,0,0);
return max;
}
let ps=[10, 25, 15, 6, 7];
let pt=[5, 12, 8, 3, 4]
console.log(solution(20, ps, pt));
이진트리 DFS 탐색
- 한 배열의 부분집합은 해당 원소를 '포함한다' or '포함하지 않는다' 의 두가지 경우를 가진 이진트리로 볼 수 있다.
- 따라서 호출하는 재귀함수를 두 가지 경우 (포함하고 계산, 포함하지 않고 계산) 로 나눌 수 있다.
- 이 때 재귀는 스택에 쌓여있던 함수가 다시 실행되며 복귀주소로 돌아와, 다음 재귀를 실행하며 반복되는 것.
- 원소의 개수가 많아질수록 시간이 오래 걸린다. 따라서 이럴 경우 동적 프로그래밍 방식의 풀이가 적절하다.
'Algorithm & 자료구조 > (인프런) 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
[알고리즘] 순열구하기 (0) | 2022.03.19 |
---|---|
[알고리즘] 중복순열 구하기 (0) | 2022.03.16 |
[알고리즘] 합이 같은 부분집합(DFS) (0) | 2022.03.09 |
[알고리즘] 아나그램 (해쉬) (0) | 2022.02.22 |
[알고리즘] 학급회장 (해쉬) (0) | 2022.02.22 |