[DFS] 2. ๋ฐ๋์ด ์น์ฐจ
<<ํ์ด>>
-๋์ ํ์ด-
์์ง ์ต์ํ์ง ์์ ํ์ธ๊ฐ ?? ๋ฌธ์ ๋ ์ฌ์ ๋ณด์๊ณ ์ค์ ๋ก๋ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์๊ฒ ํ์ด๋ฅผ ๋ง๋ค์๋๋ฐ, ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ง๋๊ฑฐ ๊ฐ์ง๋ง ๊ทธ๋ฌํ์ง ๋ชปํ๊ณ ํ๋ ธ๋ค ใ ใ
์ผ๋จ ๋๋ ๊ฐ ์๋ฆฌ ์๋ฅผ ๋ํ๋ค ์๋๋ฉด ๋ ํ์ง ์๋๋ค ์ด๋ ๊ฒ ๊ฒฝ์ฐ์ ์๋ฅผ ๋๊ณ ์งํํ๋ค.
import java.util.ArrayList;
import java.util.Scanner;
class Main {
static int answer;
static ArrayList<Integer> list = new ArrayList<>();;
private void DFS(int L, int maxNum, int[] arr) {
if (answer > maxNum) {
answer -= arr[L - 1];
list.add(answer);
return;
} else {
if(L > arr.length - 1) return;
answer += arr[L];
DFS(L + 1, maxNum, arr);
answer -= arr[L];
DFS(L + 1, maxNum, arr);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int maxNum = in.nextInt();
int total = in.nextInt();
int[] arr = new int[total];
for (int i = 0; i < total; i++) {
arr[i] = in.nextInt();
}
T.DFS(0, maxNum, arr);
int max = 0;
for (int x : list) {
if (max <= x) max = x;
}
System.out.println(max);
}
}
-๊ฐ์ฌ๋ ํ์ด-
์ ๋ง๋ค ์ด๋ ๊ฒ ํ๋ฉด ๋๋๊ตฌ๋ ~~ ํ๊ณ ์๋ค ใ ใ
<<ํ์ด ์ ๊ทผ ๋ฐฉ์>>
์ด ๋ฌธ์ ์ ํต์ฌ ํ์ด๋ฒ์ 2^n ์ด๋ค. ํฉํ ๊น ํฉํ์ง ์์๊น ์ด๋ ๊ฒ 2๊ฐ์ง๋ก ๊ณ์ ๋ด๋ ค์จ๋ค. ๊ทธ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐฏ์๋ ์๋ ์ด 2^n ์ด๋ค.
๊ทผ๋ฐ, ๋ฒ์ ๋ด์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์กฐ๊ฑด์ ํด๋นํ์ง ์์ผ๋ฉด ๋นผ๋ ๊ฒ ๋ฟ์ด๋ค. ์ด๋ฌํ ๋ ผ๋ฆฌ๊ตฌ์กฐ๋ก ํผ๋ค๋ฉด ์ฝ๊ฒ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
<<๊ตฌ์กฐ์ ์ ๊ทผ ๋ฐฉ์>>
DFS์ ๋งค๊ฐ๋ณ์์ sum์ ๋ฃ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค.
์ ์ฒด์ ์ธ ๊ตฌ์กฐ๋ ์ฌ๊ทํจ์๋ก์ ๋๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ค์ ์ฌ๊ทํจ์๊ฐ ์งํ์ด ๋ ๋, ์กฐ๊ฑด์ผ๋ก ์ฑ๋ฆฝํ๋์ง ๋จผ์ ํ ๋ณํ ํ์ ๊ทธ ๋ค์ ์์ ์งํํ๋ค.
์ฌ๊ธฐ์ ๋๋ sum + arr[L] ํ๊ณ returnํด์ ๋์์ค๋ฉด, ๋ญ๊ฐ๊ฐ sum์ ๋ํ ๋ด์ฉ์ด ๋ฐ๋๊ฑฐ ๊ฐ์ง๋ง,
์กฐ๊ฑด์ ์ถฉ์กฑํ๊ณ Math.max ์ ์ ๋ฃ๊ณ ๊ฑฐ๊ธฐ์ ๋ํ ๋ฐํ๊ฐ์ด answer ์ ๋ค์ ๋ฃ์ด์ค ๋ ๋น๋ก์ ๋ฐ์์ด ๋๋ค.
*์ฃผ๋ก DFS๋ฌธ์ ๋ if๊ฐ ์๊ณ ๊ทธ ๋ค์ DFS๊ฐ ์๋ค.
import java.util.Scanner;
class Main {
static int answer, c, n;
private void DFS(int L, int sum, int[] arr) {
if (sum > c) return; // ํํฐ ์ญํ ์ ํ๊ณ ์๋ค
if (L == n) {
answer = Math.max(sum, answer);
} else {
DFS(L+1, sum + arr[L], arr);
DFS(L+1, sum , arr);
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
c = in.nextInt();
n = in.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
}
T.DFS(0, 0, arr);
System.out.println(answer);
}
}
์ด๋ฒ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๋จธ๋ฆฟ์์ผ๋ก ํ๋๊น ์ดํด๋ ๋ฉด์์ ๊ธด๊ฐ๋ฏผ๊ฐํ ๊ฑฐ ๊ฐ๋ค ใ ใ
์ด ๋ฌธ์ ๋ฅผ ์ง์ ๊ทธ๋ ค๋ณด๋ฉด์ ๋ค์ ๋ด์ผ๊ฒ ๋ค !!
์ถ๊ฐ ๊ณต๋ถ๋ก ์ง์ ๊ทธ๋ ค๋ณด์๋ค. ์ญ์ ๊ทธ๋ ค๋ณด๋๊น ํจ์ฌ ์ดํด๊ฐ ์ ๋๋ค. DFS ์ BFS๋ ๋จธ๋ฆฌ๋ก๋ง ํ์ ํ๊ธฐ์ ํ๊ณ๊ฐ ์๋ค.
๋ฐ๋ผ์, ์ด๋ฅผ ์ง์ ๊ทธ๋ ค๋ณด๊ณ ํ๋จํ์!!
'์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/1051/์ค๋ฒ3] ์ซ์ ์ ์ฌ๊ฐํ (1) | 2024.02.22 |
---|---|
[DFS] 3. ์ต๋์ ์ ๊ตฌํ๊ธฐ (1) | 2024.02.22 |
[DFS] 1. ํฉ์ด ๊ฐ์ ๋ถ๋ถ์งํฉ (3) | 2024.02.14 |
[BFS] 14. ๊ทธ๋ํ ์ต๋จ ๊ฑฐ๋ฆฌ (2) | 2024.02.10 |
[DFS] 13. ๊ฒฝ๋กํ์(์ธ์ ๋ฆฌ์คํธ, ArrayList) (2) | 2024.02.10 |
๋๊ธ