일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코틀린기초
- 프로그래머스
- 백준 1197번 최소 스패닝 트리 - java
- Stack
- 18111번 마인크래프트 - java 구현
- HashSet
- StringBuilder
- mysql hy000 에러
- 백준 1806번 부분합 java
- 프로그래머스 java
- 최소 힙 1927
- map
- 백준 1541
- append
- kotlin
- HashMap
- ac 5430번
- 백준 3190번
- toUpperCase
- Java
- hash
- dp
- 백준 1647번 도시 분할 계획 - java
- 프로그래머스 자바
- 백준 2473번 세 용액 - java
- 백준 14938번 서강그라운드
- 백준 2467번 용액 자바 - 이분탐색
- 백준 1043번 거짓말 - java 분리 집합
- StringTokenizer
- replace()
Archives
- Today
- Total
말하는 컴공감자의 텃밭
SW expert 5215번 햄버거 다이어트 D3 - DFS 본문
728x90
햄버거 재료를 제한된 칼로리에 맞게 조합하고, 민기의 선호도가 가장 높은 조합의 점수를 출력하면 된다.
DFS를 이용해 재귀를 통해 제한된 칼로리 이내의 모든 경우를 찾아 주었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import java.io.*; import java.util.*; class Solution { // swea 5215. 햄버거 다이어트 D3 // 칼로리 범위 내에서 모든 재료 넣어서 최대값 구하기. public static boolean used[]; public static int[][] ingredient; public static int answer, N, L; public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for (int tc = 1; tc <= T; tc++) { N = sc.nextInt(); // 재료 수 L = sc.nextInt(); // 칼로리 제한 answer = 0; used = new boolean[N]; ingredient = new int[N][2]; for (int i = 0; i < N; i++) { ingredient[i][0] = sc.nextInt(); // 맛 점수 ingredient[i][1] = sc.nextInt(); // 칼로리 } dfs(0, 0, 0); System.out.println("#" + tc + " " + answer); } } public static void dfs(int depth, int cal, int point) { answer = Math.max(answer, point); for (int i = depth; i < N; i++) { if (cal + ingredient[i][1] <= L && !used[i]) { used[i] = true; dfs(depth + 1, cal + ingredient[i][1], point+ingredient[i][0]); used[i] = false; } } } } | cs |
아 간단하네~ 했는데
에?
T가 높은 인풋도 있나보다.
public static void dfs(int depth, int cal, int point) {
answer = Math.max(answer, point);
for (int i = depth; i < N; i++) {
if (cal + ingredient[i][1] <= L && !used[i]) {
used[i] = true;
dfs(depth + 1, cal + ingredient[i][1], point+ingredient[i][0]);
used[i] = false;
}
}
}
dfs에서 가지를 칠게 있을까 싶었다.
근데 모르겠어. 왜 왜 오버야 왜이래 좀
그냥 단순히 더 줄여버렸다. 재료를 쓰거나 안쓰거나로..
둘다 n^2 라고 생각하는데... 흠
public static void dfs(int depth, int cal, int point) {
if (cal > L) {
return;
}
// 모든경우 다 찾았으므로
if (depth == N) {
answer = Math.max(answer, point);
return;
}
dfs(depth + 1, cal + ingredient[depth][1], point + ingredient[depth][0]);
dfs(depth + 1, cal, point);
}
간결하네 간결해.
기존에는 조건에 부합하면 dfs를 돌려주었다. 넣었을때 칼로리가 초과되지 않는다면 dfs를 진행했다면
수정된 코드는 현재 번호의 재료를 쓰거나, 안쓰거나로 나눠 모든 경우를 탐색했다.
import java.io.*; import java.util.*; class Solution { // swea 5215. 햄버거 다이어트 D3 // 칼로리 범위 내에서 모든 재료 넣어서 최대값 구하기. public static int[][] ingredient; public static int answer, N, L; public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for (int tc = 1; tc <= T; tc++) { N = sc.nextInt(); // 재료 수 L = sc.nextInt(); // 칼로리 제한 answer = 0; ingredient = new int[N + 1][2]; for (int i = 0; i < N; i++) { ingredient[i][0] = sc.nextInt(); // 맛 점수 ingredient[i][1] = sc.nextInt(); // 칼로리 } dfs(0, 0, 0); System.out.println("#" + tc + " " + answer); } } public static void dfs(int depth, int cal, int point) { if (cal > L) { return; } // 모든경우 다 찾았으므로 if (depth == N) { answer = Math.max(answer, point); return; } dfs(depth + 1, cal + ingredient[depth][1], point + ingredient[depth][0]); dfs(depth + 1, cal, point); } }
728x90
'알고리즘 > SW expert - Java' 카테고리의 다른 글
Sw expert 4789. 성공적인 공연 기획 D3 - 구현 (1) | 2023.12.06 |
---|---|
SW expert 1249. [S/W 문제해결 응용] 4일차 - 보급로 D4 - BFS (2) | 2023.12.04 |
SW expert 1244번 최대 상금 - 자바 java DPS (0) | 2023.09.05 |
SW expert 17642. 최대 조작 횟수 <D3> - 자바 java (0) | 2023.08.12 |
Sw expert - 1208.Flatten <D3> - 자바 java (0) | 2023.08.06 |
Comments