티스토리 뷰

알고리즘/백준

[JAVA] 백준 11729번

코딩가딩 2021. 12. 16. 02:56

https://www.acmicpc.net/problem/11729

 

11729번: 하노이 탑 이동 순서

세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로

www.acmicpc.net

 

💡 가장 작은 단위에서부터 시작해서 큰 단위가 어떻게 움직이는지를 캐치하는 것이 관건!

 

문제 해결 과정

1. 점화식을 통해 원판을 옮길 횟수를 계산

   -> 2^n - 1

 

 

2. 원판 N개 중 맨 아래 (가장 큰) 원판을 C로 옮기기 위해서는 나머지(N-1)개의 원판을 B로 이동시켜야 한다. (N-1번 동작)

 

3. 그 후 맨 아래에 있던 원판을 C로 이동시킨다. (1번 동작)

 

4. B에 있던 나머지(N-1)개의 원판을 C로 이동시킨다. (N-1번 동작)

 

 

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
40
import java.io.BufferedReader;
import java.io.InputStreamReader;
 
public class Main {
 
    static int N;
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        
        // 점화식으로 횟수 계산
        sb.append((int) Math.pow(2, N)-1 + "\n");
        hanoi(N, 123);
        
        System.out.println(sb);
    }
    
/*    cnt : 옮길 원판의 개수
    from : 출발지 (시작 기둥)
    tmp : 경유지 (중간 기둥)
    to : 목적지 (도착 기둥)  */
    
    static void hanoi(int cnt, int from, int tmp, int to) {
        
        // 기저 조건 (더이상 옮길 원판 없음)
        if(cnt==0return;
        
        // 1. 원판을 출발지에서 경유지로 이동
        hanoi(cnt-1, from, to, tmp);
        
        // 2. 원판을 출발지에서 목적지로 이동 (한번 동작)
        sb.append(from + " " + to + "\n");
 
        // 3. 원판을 경유지에서 목적지로 이동
        hanoi(cnt-1, tmp, from, to);
    }
 
}
cs

 

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA] 백준 15686 치킨배달  (0) 2022.01.05
[JAVA] 백준 2529번 부등호  (0) 2021.12.19
[JAVA] 백준 11659번  (0) 2021.12.13
[JAVA] 백준 17471번  (0) 2021.03.24
[JAVA] 백준 14891번  (0) 2021.03.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
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
글 보관함