| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 정렬
- 별찍기10
- 스레드
- 코딩
- 소수
- 부트캠프후기
- LG유플러스 유레카 프론트엔드
- Java
- 애자일
- 알고리즘
- 자바
- git branch 협업
- 시간 복잡도
- 멀티캠퍼스IT부트캠프
- 멀티캠퍼스IT부트캠프티
- 프로세스
- 브루트포스
- 프론트엔드
- LG유플러스 유레카 프론트엔드 개발자
- 프론트엔드 비대면반
- 재귀
- 유레카 부트캠프
- zod
- tanstack query
- 백준
- 웹시큐리티
- 2775번 문제
- LG유플러스 유레카 3기 프론트엔드
- LG유플러스 유레카 부트캠프
- Do it! 자료구조와 함께 배우는 알고리즘 입문
- Today
- Total
개발 일기
백준 11729번 문제풀이 - 하노이 탑 이동 순서 본문

https://www.acmicpc.net/problem/11729
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
하노이 탑 이동 순서를 출력하고 총 이동횟수를 출력하는 문제이다.
재귀 알고리즘을 사용하여 메서드를 만들고 결과를 출력하도록 했다.
하노이 탑의 이동 알고리즘을 보면 N개의 원판을 이동해야된다고 했을 때
처음엔 중간 기둥으로 N-1개의 원판을 다 옮겨야된다. 그 이후 마지막 원판을 목표 기둥으로 옮긴다.
중간 기둥에 있는 원판을 목표 기둥으로 옮기는 과정을 계속해서 반복하게 된다.
재귀 알고리즘으로 보자면
N-1이 실행되고 처음 기둥에서 목표 기둥으로 끝원판을 옮긴 뒤 N-1이 한번 더 실행되는 구조라고 볼 수 있다.
코딩
public class Hanoi {
public static StringBuilder sb = new StringBuilder();
// 하노이 탑 이동순서 메서드
static void move(int N,int x,int y) {
if (N > 1) {
move(N-1, x, 6 - x - y); // 1에서 2기둥으로 다 옮김
}
sb.append(x+" "+y).append('\n');
if (N > 1) { // 2에서 3으로 다 옮김
move(N-1, 6 - x - y, y);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int count = (int)Math.pow(2, N) - 1; // 원판 이동횟수
System.out.println(count);
move(N, 1, 3);
System.out.println(sb);
}
}
move 메서드를 보면 첫 번째로 N > 1일 때 중간 기둥으로 옮기는 과정에 재귀로 계속 호출되고 N = 1이 되면 첫 번째 기둥에서 목표 기둥으로 원판을 옮긴 뒤 중간 기둥에서 목표 기둥으로 원판을 옮기는 과정이 재귀로 계속 호출되어 실행하게 된다.
결과

StringBuilder를 사용하지 않고 메서드에 매순간 print하도록 했을 때는 시간 초과로 문제가 해결되지 않았지만 StringBuilder를 사용하고 문제를 풀 수 있었다.
느낀 점
재귀 알고리즘 자체는 이해가 됐지만 실제로 적용해보고 코드를 짜는데는 아직 어려움이 많은 것 같다. 재귀 알고리즘을 많이 접해보고 적용시켜보려고 하면서 실력을 키워야될 것 같다.
'백준 문제풀이' 카테고리의 다른 글
| 백준 2231번 문제풀이 - 분해합 (0) | 2021.12.02 |
|---|---|
| 백준 2447번 문제풀이 - 별찍기 - 10 (0) | 2021.12.01 |
| 백준 1018번 문제풀이 - 체스판 다시 칠하기 (0) | 2021.11.29 |
| 백준 2798번 문제풀이 - 블랙잭 (0) | 2021.11.29 |
| 백준 10870번 문제풀이 - 피보나치 함수 (0) | 2021.11.28 |