1. ๋ฌธ์ ์ค๋ช
ํ๋ ธ์ด ํ(Tower of Hanoi)์ ํผ์ฆ์ ์ผ์ข ์ ๋๋ค. ์ธ ๊ฐ์ ๊ธฐ๋ฅ๊ณผ ์ด ๊ธฐ๋์ ๊ฝ์ ์ ์๋ ํฌ๊ธฐ๊ฐ ๋ค์ํ ์ํ๋ค์ด ์๊ณ , ํผ์ฆ์ ์์ํ๊ธฐ ์ ์๋ ํ ๊ธฐ๋ฅ์ ์ํ๋ค์ด ์์ ๊ฒ์ด ์์ ์๋๋ก ์์๋๋ก ์์ฌ ์์ต๋๋ค. ๊ฒ์์ ๋ชฉ์ ์ ๋ค์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋ฉด์, ํ ๊ธฐ๋ฅ์ ๊ฝํ ์ํ๋ค์ ๊ทธ ์์ ๊ทธ๋๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ผ๋ก ์ฎ๊ฒจ์ ๋ค์ ์๋ ๊ฒ์ ๋๋ค.
- ํ ๋ฒ์ ํ๋์ ์ํ๋ง ์ฎ๊ธธ ์ ์์ต๋๋ค.
- ํฐ ์ํ์ด ์์ ์ํ ์์ ์์ด์๋ ์๋ฉ๋๋ค.
ํ๋ ธ์ด ํ์ ์ธ ๊ฐ์ ๊ธฐ๋ฅ์ ์ผ์ชฝ ๋ถํฐ 1๋ฒ, 2๋ฒ, 3๋ฒ์ด๋ผ๊ณ ํ๊ฒ ์ต๋๋ค. 1๋ฒ์๋ n๊ฐ์ ์ํ์ด ์๊ณ ์ด n๊ฐ์ ์ํ์ 3๋ฒ ์ํ์ผ๋ก ์ต์ ํ์๋ก ์ฎ๊ธฐ๋ ค๊ณ ํฉ๋๋ค.
1๋ฒ ๊ธฐ๋ฅ์ ์๋ ์ํ์ ๊ฐ์ n์ด ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, n๊ฐ์ ์ํ์ 3๋ฒ ์ํ์ผ๋ก ์ต์๋ก ์ฎ๊ธฐ๋ ๋ฐฉ๋ฒ์ returnํ๋ solution๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- n์ 15์ดํ์ ์์ฐ์ ์ ๋๋ค.
์ ์ถ๋ ฅ ์
n | result |
---|---|
2 | [ [1,2], [1,3], [2,3] ] |
์ ์ถ๋ ฅ ์ ์ค๋ช
์
์ถ๋ ฅ ์ #1
๋ค์๊ณผ ๊ฐ์ด ์ฎ๊ธธ ์ ์์ต๋๋ค.
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ์ฐ์ต, https://school.programmers.co.kr/learn/challenges
2. ํ์ด ์ค๋ช
keyword
: ์ฌ๊ท
ํ์ด๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํธ์๋ฅผ ์ํด์ ํ์ฌ ๋ธ๋ก์ด ์๋ ์์น๋ฅผ ์์์
, ๋ธ๋ก์ด ๊ฐ์ผํ ์์น๋ฅผ ๋ชฉ์ ์ง
๊ทธ ์ธ์ ์ฅ์๋ฅผ ์ค๊ฐ ์ง์
์ด๋ผ๊ณ ํ๊ฒ ๋ค.
โ ์ต์ ๋ธ๋ก์ ์ ์ธํ ๋ชจ๋ ๋ธ๋ก์ ์ค๊ฐ ์ง์ ์ผ๋ก ์ฎ๊ธด๋ค. (Top-down ์ฌ๊ท ์ด์ฉ)
โ ์ต์ ๋ธ๋ก์ ๋ชฉ์ ์ง๋ก ์ฎ๊ธด๋ค. (๋ฐฐ์ด์ log ์ ์ฅ)
โ ๋๋จธ์ง ๋ธ๋ก์ ๋ชจ๋ ๋ชฉ์ ์ง๋ก ์ฎ๊ธด๋ค. (Top-down ์ฌ๊ท ์ด์ฉ)
์ค์ง์ ์ผ๋ก ์๋ํ๋ ์ฝ๋๋ โ ๋ฐ์ ์๋ค. ๋๋จธ์ง๋ ๊ณ์ ์ฌ๊ท์ด๋ค.
๋ฐ๋ผ์ ๋ชฉ์ ์ง์ ์ต์ ๋ธ๋ก์ ์ฎ๊ธฐ๋ ์ โ๋ก ๋ชจ๋ ์ด๋ ์์
์ด ์์๋๋ก ์ฐํ์ผ ํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ค์ํ ์ ์ ์ ๋ชฉ์ ์ง๋ฅผ ์ฌ๊ท๊ฐ ๊น์ด์ง์ ๋ฐ๋ผ ๋ค ๋ค๋ฅด๊ฒ ์ค์ ํด์ค์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์๋ ์ฝ๋๋ก ์์ฑ ํด๋ณด๋ฉด,
// ๋ชจ๋ ๋ธ๋ญ์ ํ๋
ธ์ดํ ๊ท์น์ ์๊ฑฐํด์ ์์์ ์์ ๋ชฉ์ ์ง๋ก ์ฎ๊ธฐ๋ ํจ์
public void hanoi(int ์์์ , int ์ค๊ฐ ์ง์ , int ๋์ , int ๋จ์ ๋ธ๋ญ์ ์) {
// ๊ธฐ์ ์กฐ๊ฑด
if (์์ง์ฌ์ผํ ๋ธ๋ญ์ด ๋จ์ง ์์๋ค๋ฉด,) {
๊ทธ๋ฅ return ํด์ ์๋์ ์ฌ๊ท๋ก ๋๋์ ๊ฐ๋ค.
}
// ๊ณ์ฐํ๋ ๊ณณ
// 1. ์ต์ ๋ธ๋ก ์ ์ธํ ๋ชจ๋ ๋ธ๋ก์ ์ค๊ฐ์ง์ ์ผ๋ก ์ฎ๊ธด๋ค.
// ์ต์ ๋ธ๋ก์ ์ ์ธํ ๋ชจ๋ ๋ธ๋ก๋ค์ ์ค๊ฐ์ง์ ์ผ๋ก ๊ฐ์ผํ๊ธฐ ๋๋ฌธ์ ์ค๊ฐ ์ง์ ์ด ๋ชฉ์ ์ง๊ฐ ๋๊ณ ,
// ๋์ ์ด ์ค๊ฐ ์ง์ ์ด ๋๋ค.
hanoi(์์์ , ๋์ , ์ค๊ฐ์ง์ , ๋จ์ ๋ธ๋ญ์ ์ - 1);
// 2. ์ต์ ๋ธ๋ก ์ฎ๊ธฐ๊ธฐ
์ต์ ๋ธ๋ก์ ์ฎ๊ธฐ๋ ์ฝ๋: ๋ก๊ทธ ์ฐ๊ธฐ ํน์ ๋ฐฐ์ด์ ๊ฐ ์ ์ฅ
// 3. ์ค๊ฐ์ง์ ์ผ๋ก ์ฎ๊ธด ๋๋จธ์ง ๋ธ๋ก๋ค์ ๋ ์ ์ ์ต์ ๋ธ๋ก ์๋ก ๋ชจ๋ ์ฎ๊ธด๋ค.
hanoi(์ค๊ฐ์ง์ , ์์์ , ๋์ , ๋จ์ ๋ธ๋ญ์ ์ - 1);
}
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
class Solution {
static ArrayList<int[]> list = new ArrayList<>();
public ArrayList<int[]> solution(int n) {
hanoi(1,2,3,n);
return list;
}
public void hanoi(int start, int mid, int end, int stack) {
if(stack == 0){
return;
}
hanoi(start, end, mid, stack-1); // ์ต์ ๋ธ๋ก ์ ์ธ ์ ๋ถ start -> mid๋ก ์ด๋
list.add(new int[]{start,end}); // ์ต์ ๋ธ๋ก start -> end ์ด๋
hanoi(mid,start,end,stack-1); // ์ต์ ๋ธ๋ก ์ ์ธ ์ ๋ถ mid -> end ์ด๋
}
}
๋ด ์ฝ๋์ ์์ฌ์ด ์
๋ฌธ์ ๋ฅผ ํ ๋, ๋ฐํํ์ int[][] [ ] [ ] ์์ ArrayList<int [ ]> ๋ก ๋ฐ๊พธ์๋ค. ์ฐ์ ๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ช ํํ๊ฒ ๊ตฌํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ํตํด ๊ณต๋ถํด์ ๋ณด์ ํ๋ค.
4. ์ข์์ ๋ง์ด ๋ฐ์ ๋ค๋ฅธ ์ฌ๋์ ํ์ด
class Solution {
private int index = 0;
public int[][] solution(int n) {
int[][] answer = new int[(int) (Math.pow(2,n)-1)][2];
move(n, 1, 3, 2, answer);
return answer;
}
public void move(int n, int start, int end, int between, int[][] answer) {
if (n == 1) {
answer[index++] = new int[]{start, end};
return;
}
move(n - 1, start, between, end, answer);
answer[index++] = new int[]{start, end};
move(n - 1, between, end, start, answer);
}
}
๋ฐฐ์ด์ ํฌ๊ธฐ๋ [ n^2 - 1 ] [ 2 ] ์ด๋ค. ์ฌ๊ท๊ฐ ๊น์ด์ง์๋ก ๊ณ์ฐ ํ์ฌ์ผ ํ ๊ฐ์ด 2๋ฐฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํ์ 2^n -1 ์ ํฌ๊ธฐ์ด๋ค. (root๋ ๊ณ์ฐ์ ํ๋ฒ๋ง ํ๋ฉด ๋์ 1 ๋นผ์ค๋ค.) ์ด์ start์ end ๋ ๊ฐ๊ฐ ์ ํ์ผ ํ๋ฏ๋ก ํฌ๊ธฐ๊ฐ 2์ด๋ค.
๋ํ ์ฌ๊ธฐ์๋ ๊ธฐ์ ์กฐ๊ฑด์ n == 1๋ก ํด์ฃผ์๋๋ฐ, ๋ด๊บผ๋ n == 0์ผ๋ก ํด์ ๋ถ ํ์ํ ์ฌ๊ท๋ฅผ 2^n๋ฒ ๋ ํ๋ค. ์ด ๋ถ๋ถ์ ๋ฐ๊พธ๋ฉด ์๊ฐ์ ์ฑ๋ฅ์ด ๊ฐ์ ๋ ๊ฑฐ ๊ฐ๋ค.