๐ ํ๋ก๊ทธ๋๋จธ์ค / Level2 / ํ๋ ธ์ด์ ํ
๐ ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ซ ์ ํ ์ฌํญ
- n์ 15์ดํ์ ์์ฐ์์ ๋๋ค.
๐ ์ ์ถ๋ ฅ ์
| n | result |
| 2 | [ [1,2], [1,3], [2,3] ] |
๐ค ํ์ด ๋ฐฉ๋ฒ
1๏ธโฃ ํ ์ด๋ ๊ท์น ํ์ ํ๊ธฐ
โก๏ธ ํ์ ์ด๋์ํค๋ ๊ณผ์ ์ ์๋ 3๋จ๊ณ๋ก ๋๋์ด๋ณด์๋ค.
โ ๊ฐ์ฅ ํฐ ์ํ ์ธ ๋๋จธ์ง๋ฅผ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ฎ๊ธด๋ค.
โก ๊ฐ์ฅ ํฐ ์ํ์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค.
โข ๊ณผ์ โ ์์ ์ฎ๊ฒจ๋์๋ ์ํ๋ค์ 3๋ฒ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ธด๋ค.
โก๏ธ ๋ ๋ช๊ฐ๋ฅผ ๋์ดํด๋ณด๋ ์๊ตฌ๋๋ ์ด๋ ์๊ฐ 2์ n์ ๊ณฑ ๋ฑ๋น์์ด์ ํฉ ํํ๋ก ๋์๊ฐ๋ ๊ฒ์ ์ ์ ์์๋ค.
โ ์ํ์ด 1๊ฐ ์ผ ๋ : [ [1,2] ] โก๏ธ 1๋ฒ ์ด๋
โก ์ํ์ด 2๊ฐ ์ผ ๋ : [ [1,2], [1,3], [2,3] ] โก๏ธ 1+2 = 3๋ฒ์ด๋
โข ์ํ์ด 3๊ฐ ์ผ ๋ : [ [1,2], [1,3], [2,3] ... [2,3] ] โก๏ธ 1+2+4 = 7๋ฒ ์ด๋
2๏ธโฃ ์ฌ์ฉํ ์๊ณ ๋ฆฌ์ฆ : DFS
โก๏ธ ์ํ์ด ์ด๋ํ๋ ๊ณผ์ ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์๋ค.

โก๏ธ ์ด๋ ์์ผ์ผํ ์ํ์ ๊ฐ์๊ฐ 1๊ฐ๊ฐ ๋ ๋ ๊น์ง ๊ณ์ํด์ ํจ์๋ค์ ํธ์ถํจ์ผ๋ก DFS ์ ํํ๋ฅผ ๋ณด์ธ๋ค๊ณ ํ ์์๋ค.
3๏ธโฃ ์ฝ๋ ํ์ด
โก๏ธ ์ ์ผ ํต์ฌ์ด ๋๋ ์ฝ๋๋ DFS ๋ฅผ ๊ตฌํํ ๋ถ๋ถ์ด ๋ ๊ฒ์ด๋ค.
public static void hanoi(int num, int start, int end) {
// โ
if (num == 1) {
answer[cnt][0] = start;
answer[cnt][1] = end;
cnt++;
return;
}
// โก
int sum = start + end;
int left = 0;
switch (sum) {
case 3:
left = 3;
break;
case 4:
left = 2;
break;
case 5:
left = 1;
break;
}
// โข
hanoi(num -1, start, left);
hanoi(1, start, end);
hanoi(num -1, left, end);
}
๊ณผ์ โ : ์ด๋์์ผ์ผํ ์ํ์ ๊ฐ์๊ฐ 1๊ฐ๋ผ๋ฉด ์์ ๊ธฐ๋ฅ ์์น์์ ๋ชฉํ ๊ธฐ๋ฅ ์์น๋ก ๋ฐ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ด ์ต์ ์ด๋์ผ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ [start, end] ๋ฅผ ์ถ๊ฐํด์ค ๋ค return ํด์ฃผ๋ฉด ๋๋ค.
๊ณผ์ โก : ์์ ์ธ๊ธํ ์ํ ์ด๋ 3๋จ๊ณ ์ค ์ฒซ๋ฒ์งธ ๋จ๊ณ์์ ์ด๋ ๊ธฐ๋ฅ์ผ๋ก ๋๋จธ์ง ์ํ์ ๋จผ์ ์ด๋์์ผ์ผํ ์ง๋ฅผ ์ ํ๊ธฐ์ํจ์ด๋ค. ๊ฐ์ฅ ํฐ ์ํ์ ์์ ๊ธฐ๋ฅ๊ณผ ๋ชฉํ ๊ธฐ๋ฅ ์ธ ๋๋จธ์ง ํ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํด์ผํ๊ธฐ ๋๋ฌธ์ ํฉ์ ๋ฐํ์ผ๋ก ํด๋น ๊ธฐ๋ฅ์ ๊ตฌํ๋ค.
โก๏ธ ๋ค๋ฅธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๊ฐ์ ์ด ํ์ํ ์ฝ๋์ธ๊ฒ ๊ฐ๋คโ๏ธ
๊ณผ์ โข : ๊ณ์ํด์ hanoi ํจ์๋ฅผ ํธ์ถํ๋ฉด์ DFS ๋ฅผ ์ํํ๋ค.

โก๏ธ ๊ด์ฐฎ์ ์๋๋ก ํด๊ฒฐํ๋ค.
๐ป ํ์ด ์ฝ๋
class Solution {
public static int[][] answer;
public static int cnt = 0;
public int[][] solution(int n) {
// ๋ฐฐ์ด ์ด๊ธฐํ
int total = (int) Math.pow(2, n) - 1;
answer = new int[total][2];
// 1๋ฒ์์ 3๋ฒ ์ํ์ผ๋ก ์ด๋
hanoi(n, 1, 3);
return answer;
}
/*
int num : ์ด๋ํด์ผํ ์ํ์ ๊ฐ์
int start : ์์ ๊ธฐ๋ฅ ๋ฒํธ
int end : ๋์ฐฉ ๊ธฐ๋ฅ ๋ฒํธ
*/
public static void hanoi(int num, int start, int end) {
if (num == 1) { // ์ฎ๊ฒจ์ผํ ์ํ์ด 1๊ฐ ์ธ ๊ฒฝ์ฐ : start, end ์ฝ์
ํ ๋ฆฌํด
answer[cnt][0] = start;
answer[cnt][1] = end;
cnt++;
return;
}
// ์ด๋ ๊ธฐ๋ฅ์ผ๋ก ์ด๋ํ ์ง ๊ฒฐ์
int sum = start + end;
int left = 0;
switch (sum) {
case 3:
left = 3;
break;
case 4:
left = 2;
break;
case 5:
left = 1;
break;
}
// ์ํ ์ด๋ ์์ (1) : ๋ง์ง๋ง ์ํ์ ์ ์ธํ ๋๋จธ์ง ์ํ์ ๋ชฉํ ๊ธฐ๋ฅ ์ธ ๋๋จธ์ง๋ก ์ด๋
hanoi(num -1, start, left);
// ์ํ ์ด๋ ์์ (2) : ๋ง์ง๋ง ์ํ์ ๋ชฉํํ ์์น๋ก ์ด๋
hanoi(1, start, end);
// ์ํ ์ด๋ ์์ (3) : ๋๋จธ์ง ์ํ์ ๋ชฉํ ์์น๋ก ์ด๋
hanoi(num -1, left, end);
}
}
[level 2] Title: ํ๋ ธ์ด์ ํ, Time: 2.21 ms, Memory: 109 MB -BaekjoonHub · Young998904/Practice_Algorithm_Auto@337ff72
Show file tree Showing 2 changed files with 111 additions and 0 deletions.
github.com
'Algorithm ๐ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| (์๊ณ ๋ฆฌ์ฆ ์คํฐ๋) (Programmers) ํธํ ๋์ค ๐จ (0) | 2023.07.26 |
|---|---|
| (์๊ณ ๋ฆฌ์ฆ ์คํฐ๋) (Programmers) ์ฌ ์ฐ๊ฒฐํ๊ธฐ ๐๏ธ (0) | 2023.07.20 |
| ์ด๋ถ ํ์ ๐ (Binary Search) (0) | 2023.04.17 |
| ๊ทธ๋ํ๐ (Graph) (0) | 2023.03.21 |
| ๋์ ๊ณํ๋ฒ๐๏ธ (Dynamic Programming) (0) | 2023.03.13 |