문제설명은 간략하게 하겠습니다.
주어진 과자들에서 두 봉지를 집어 m무게 이하로 과자를 가져가면 되고 집어갈 수 있는 범위내에 가장 큰 값을 구하면 됩니다.
n: 과자수 , m: 들고갈수있는 최대무게
n=6 m=10
1 2 5 8 9 11
이렇게 되어있으면 1, 9 이렇게 집어 정답은 10이 됩니다.
이 문제를 풀기위해 크게 투포인터, DFS로 풀 수 있는데 저는 DFS를 선택했습니다.
그런데 최대한 재귀를 덜 시키기위해 조합이 되도록 DFS를 구성했습니다 예를 들어
1 2 5 8 9 11
이 과자봉지들이 있으면 (1,2) 를 집으면 재귀로 다시 (2,1)을 집지 않는거죠. 1,2에서 집었기 때문입니다.
조합을 이용해 최소한으로 재귀한 다음 문제를 해결했습니다. 자세한 방법은 아래 전체코드에 dfs부분 주석참고
전체코드
import java.util.*;
class Solution
{
static int [] arr;
static int [] pm,ch ;
static int m;
static int answer;
public void dfs(int l,int s){
// 두봉지만 집기때문에 2에서 멈춤
if(l==2){
if(pm[0]+pm[1] <= m) answer= Math.max(answer, pm[0]+pm[1]);
}
else{
//조합
for(int i=s;i<arr.length;i++){
pm[l]=arr[i];
dfs(l+1,i+1);
}
}
}
public static void main(String args[]) throws Exception
{
Scanner sc = new Scanner(System.in);
int T;
T=sc.nextInt();
for(int tc = 1; tc <= T; tc++)
{
answer=-1;
int n = sc.nextInt();
m = sc.nextInt();
arr = new int[n];
ch = new int[n];
pm = new int[2];
for(int i=0;i<n;i++) arr[i]= sc.nextInt();
Solution s = new Solution();
s.dfs(0,0);
System.out.println("#"+tc+" "+answer);
}
}
}
'알고리즘 > 문제풀이' 카테고리의 다른 글
[프로그래머스] 전력망을 둘로 나누기 (Union-Find) - Java (0) | 2024.05.03 |
---|---|
[SWEA] 1954. 달팽이 숫자 - Java (0) | 2024.04.24 |
[SWEA] 7732. 시간 개념 D3 - Java (1) | 2024.04.18 |
프로그래머스 소수 찾기 - Java (0) | 2024.04.11 |
[SWEA] 2806. N-Queen - 자바 (0) | 2024.04.04 |