๐ 1. ๋ฌธ์ ์ค๋ช
๐ก 2. ๋์ ์ฝ๋
๋ฌธ์ ์์ ๊ตฌํด์ผ ํ๋ ๊ฒ - ์ต๋ ๋ช ๋ฒ ๋์ ์ ๋ ์ ์๋์ง ํ์
์ฆ, ์กด์ฌํ๋ ๋์ ๋ค์๋ก ๋๋ ์์ ๋ฐ๊ฟ๊ฐ๋ฉด์ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๋ง๋ ๋ค.
๋ง์ฝ A,B,C ๋์ ์ด ์๋ค๋ฉด? `A-B-C`,`A-C-B`,`B-A-C`,`B-C-A`, `C-A-B`, `C-B-A` ์กฐํฉ์ ๋ชจ๋ ์ํํ๋ฉด์
์ต๋๋ก ๋ช ๋ฒ ๋ ์ ์๋์ง ์นด์ดํ ํด ์ค๋ค.
๋ฐฑํธ๋ํน๊ณผ DFS(๊น์ด ์ฐ์ ํ์)
๋ฐฑํธ๋ํน๊ณผ dfs๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์กฐํฉ ํด ์ค๋ค.
depth ๋ ํ์ํ์์ด๋ค.
๊ตฌํ๋ ์๊ฐ answer = Math.max(answer, depth) ํด์ ์ต๋๊ฐ ์ ๋ฐ์ดํธ
class Solution {
// ์ ์ญ ๋ณ์ ์ ์ธ
public static int answer; // ์ต๋ ๋์ ํํ ํ์
public static boolean[] visited; // ๊ฐ ๋์ ์ ๋ฐฉ๋ฌธ ์ฌ๋ถ
// ๋ฌธ์ ๋ต ๋ฐํํ๋ ๋ฉ์๋
public int solution(int k, int[][] dungeons) {
answer= 0; // ์ด๊ธฐ๊ฐ ์ค์
visited = new boolean[dungeons.length]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด ์ด๊ธฐํ
// ๋ฐฑํธ๋ํน ํ์ ์์
// (ํ์ฌ ํํ ๊น์ด 0, ์ด๊ธฐ ํผ๋ก๋ k, ๋์ ์ ๋ณด ์ ๋ฌ)
backTracking(0, k, dungeons);
return answer;
}
// ๋ฐฑํธ๋ํน ๋ฉ์๋: ๊ฐ๋ฅํ ๋ชจ๋ ๋์ ํํ ๊ฒฝ๋ก๋ฅผ ํ์
public static void backTracking(int depth, int k, int[][] dungeons) {
// ๋์ ๋ชฉ๋ก ์ํ
for (int i = 0; i < dungeons.length; i++) {
// ์กฐ๊ฑด 1: ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋์
// ์กฐ๊ฑด 2: ํ์ฌ ํผ๋ก๋(k)๊ฐ ํด๋น ๋์ ํํ ์ต์ ์๊ตฌ ํผ๋ก๋(dungeons[i][0]) ์ด์
if (!visited[i] && dungeons[i][0] <= k) {
visited[i] = true; // ํด๋น ๋์ ์ ๋ฐฉ๋ฌธ ํ์
// ์ฌ๊ท ํธ์ถ: ํ์ฌ ๋์ ์ ํํํ ์ํ๋ก ํ์ ๊ณ์
backTracking(depth + 1, k - dungeons[i][1], dungeons);
// ๋ฐฑํธ๋ํน: ํํ์ ๋๋๋ ค ๋ค์ ๊ฒฝ๋ก๋ฅผ ํ์ํ ์ ์๋๋ก ์ด๊ธฐํ
visited[i] = false;
}
}
// ํ์ฌ๊น์ง์ ํํ ๊น์ด๋ฅผ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์
answer = Math.max(answer, depth);
}
}
1) ๋ฐฑํธ๋ํน(Back Tracking)
1. ์กฐ๊ฑด :`if (!visited[i] && dungeons[i][0] <= k)`
if๋ฌธ์ผ๋ก ๋ฐฉ๋ฌธํ์ง ์์ ๋์ & ์ต์ ํ์ ์๋ชจ๋ <= ํ์ฌ ํ์๋ ์ธ ๊ฒฝ์ฐ if ๋ฌธ ๋ด๋ถ ๋ก์ง์ ํ๊ฒ ๋๋ค.
if๋ฌธ ํ๋ฉด ๋์ ์ ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ฏ๋ก, visited๋ true๊ฐ ๋๋ค.
ํ์ฌ ํผ๋ก๋(k)๊ฐ ๋์ ์ ์๊ตฌ ํผ๋ก๋(dungeons[i][0])๋ณด๋ค ์์ผ๋ฉด ํด๋น ๊ฒฝ๋ก๋ฅผ ํ์ํ์ง ์๊ณ ๋๋์๊ฐ๋ค.
์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์์ผ๋ก์จ ๊ฐ์ง์น๊ธฐ๋ฅผ ์ํํด ์ฃผ๋ ๊ฒ์ด๋ค.
2. ๋ค์ ๋ฐฑํธ๋ํน์ ํ์ธ ๋๋ depth๋ +1 ์ ํ๋ค.
depth๋ ๋ฐฉ๋ฌธํ ๋์ ์ ๊ฐ์๊ฐ๊ฐ ๋๊ณ , ์ด๊ธฐ๊ฐ์ depth 0์ผ๋ก ์์ํ๋ค.
ํ์ฌ ํผ๋ก๋ - ๋์ ์ ํผ๋ก๋๋งํผ ์ฐจ๊ฐ์์ผ์ ๋์ ๋ฐฉ๋ฌธ ํ ๋จ์ ํผ๋ก๋๋ฅผ ๊ณ์ฐํด์ ํ์ฌ ํผ๋ก๋๋ฅผ ์
๋ฐ์ดํธ ํด ์ค๋ค.
๋์ด์ if ๋ด๋ถ ๋ก์ง์ ํ ์ ์๋ค(ํํ๋ถ๊ฐ) =>
์ฌ๊ธฐ์ ๋ฐฑํธ๋ํน์ด ์ผ์ด๋๋๋ฐ ๋ฐฑํธ๋ํน์ ๊ณง ์ด์ ์ํ๋ก ๋ณต๊ท (๋์ 1 ํํ ์ทจ์)ํ๋ค๋ ๋ป์ด๋ค.
visited[i] = false๋ก ์ด๊ธฐํํ์ฌ ํ์ ์ํ๋ฅผ ๋๋๋ฆฝ๋๋ค.
์ด ๊ณผ์ ์ ๋ค๋ฅธ ๊ฒฝ๋ก ํ์์ ์ํด ์ด๊ธฐํ ํด์ฃผ๋ ๋ฐฑํธ๋ํน์ ํต์ฌ์ด๋ค.
์ฆ, backTracking(1, 60, dungeons) ์ํ๋ก ๋ณต๊ทํ๋ค.
๊ทธ๋ฆฌ๊ณ for ๋ฃจํ์์ ๋ค์ ๋์ ํ์ ์์์ ํด ์ฃผ๋ ๊ฒ์ด๋ค.
๋์ A,B,C ๊ฐ ์๋ค๋ฉด A-B-C, A-C-B ๋ฅผ ํ์ ํด ์ค ๋ค์ B๋ฅผ ์ ๋๋ก ํ์์ ํ ํ
๋ฐ,
A์ visited๋ฅผ false๋ก ํด์ค์ผ์ง ์ฒ์๊ณผ ๊ฐ์ ์กฐ๊ฑด์์ B์์๋ B-A-C, B-C-A ๋ก ๋์ ์ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2) DFS(๊น์ด ์ฐ์ ํ์)
backTracking(depth + 1, k - dungeons[i][1], dungeons);
์ด ์ฝ๋๊ฐ DFS์ ํต์ฌ
backTracking ๋ฉ์๋๋ ์ด๋ฆ์ ๋ฐฑํธ๋ํน์ผ๋ก ์ง์์ง๋ง
๊น์ด ์ฐ์ ํ์(DFS) ๋ฐฉ์์ผ๋ก ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ํ ํ, ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค.
for ๋ฃจํ๋ฅผ ํตํด ๋์ ์ ํ๋์ฉ ํ์ => ์ฌ๊ท ํธ์ถ๋ก ๋ค์ ๊ฒฝ๋ก๋ฅผ ํํํ๋ค.
DFS๋ ๋ ์ด์ ํํํ ์ ์๋ ๋์ ์ด ์์ ๋ ์ข ๋ฃ๊ฐ ๋๋ค.
์ฆ, 3๊ฐ์ ๋์ ์ค ์กฐ๊ฑด์ ๋ง๋ ๋์ ์ด ์๊ฑฐ๋, ์ด๋ฏธ ํ์ ๊ฐ๋ฅํ ๋ชจ๋ ๋์ ์ ์ฌ๊ท ํธ์ถ๋ก ์ฒ๋ฆฌํ๋ค๋ฉด
ํ์ฌ ํธ์ถ๋ backTracking ๋ฉ์๋์ for ๋ฃจํ๊ฐ ์ข ๋ฃ๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ด ์์ ์์ ํํํ ๋์ ์(depth)๊ฐ ํ์ฌ๊น์ง์ ์ต๋๊ฐ์ธ์ง ํ์ธํ๊ณ ,
`answer = Math.max(answer, depth);` ์ดํ ์์ ํธ์ถ๋ก ๋๋์๊ฐ๋ค.
์์ ํธ์ถ์ ๋ฐฑํธ๋ํน์ผ๋ก ์ด์ ํํ ์ํ๋ก ๋๋์๊ฐ๋ฉฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ๊ณผ์ ์ผ๋ก ๊ณ์ ์งํ์ด ๋๋ค.
โญ DFS์ ๋ฐฑํธ๋ํน ๊ตฌ๋ถ
์กฐ๊ฑด ์์ด ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์: DFS
์กฐ๊ฑด์ ํตํด ํ์์ ์ค๋จํ๊ณ ๊ฐ์ง์น๊ธฐ: ๋ฐฑํธ๋ํน
๊ฒฐ๋ก ์ ์ผ๋ก, `์ด ์ฝ๋๋ ๋ฐฑํธ๋ํน์ด ํฌํจ๋ DFS`๋ผ๊ณ ์ดํดํ๋ฉด ๋ฉ๋๋ค......
๐๐ป 3. ์ข์์ ์ ์ผ ๋ง์ด ๋ฐ์ ์ฝ๋
class Solution {
public static boolean check[];
public static int ans = 0;
public int solution(int k, int[][] dungeons) {
check = new boolean[dungeons.length];
dfs(k, dungeons, 0);
return ans;
}
public static void dfs(int tired, int[][] dungeons, int cnt){
for(int i=0; i<dungeons.length; i++){
if(!check[i] && dungeons[i][0]<=tired){
check[i] = true;
dfs(tired-dungeons[i][1], dungeons, cnt+1);
check[i] = false;
}
}
ans = Math.max(ans, cnt);
}
}
๐๐ป 4. ๊ฐ์ ์ ํ ๋ฌธ์
'Algorithm > Programmers_Best' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ชจ์์ฌ์ (์์ ํ์) (56) | 2024.11.23 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ ๋ ฅ๋ง์ ๋๋ก ๋๋๊ธฐ (์์ ํ์) (6) | 2024.11.23 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์นดํซ (์์ ํ์) (70) | 2024.11.22 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ๋ชจ์๊ณ ์ฌ ๋ฌธ์ ํ์ด (์์ ํ์) (39) | 2024.11.15 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Java) ์ต์ ์ง์ฌ๊ฐํ ๋ฌธ์ ํ์ด (์์ ํ์) (33) | 2024.11.15 |