Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 깊이우선탐색
- 백준
- BFS
- 개발자스터디
- dfs
- BOJ
- 삼성청년SW아카데미
- 다이나믹프로그래밍
- 코딩테스트
- 문자열
- DP
- 파이썬
- 알고리즘
- 너비우선탐색
- 브루트포스
- 구현
- 99일지
- 자바
- 싸피
- 백트래킹
- java
- 위상정렬
- 99클럽
- til
- SSAFY수료식
- ssafy
- 항해
- 프로그래머스
- python
- programmers
Archives
- Today
- Total
EunJng
[PRO] 하노이의 탑 | Java 본문
문제
프로그래머스 코딩테스트 연습 > 연습문제 > 하노이의 탑 | Lv.2
https://school.programmers.co.kr/learn/courses/30/lessons/12946
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 알고리즘 분류 : 재귀
풀이 과정
* 유사한 문제의 파이썬 풀이를 하단에 링크 첨부하였습니다.
자바 풀이
class Solution {
public int idx = 0;
// answer에 이동 저장할 인덱스
public int[][] solution(int n) {
int num = (int)Math.pow(2, n) - 1;
// 이동 횟수는 2**n - 1
int[][] answer = new int[num][2];
hanoi(n, 1, 3, 2, answer);
return answer;
}
public void hanoi(int n, int start, int end, int tmp, int[][] answer) {
if(n == 1) {
int[] move = new int[] {start, end};
answer[idx++] = move;
return;
// n이 1이 되면 start에서 end로 이동한 후 return
}
hanoi(n-1, start, tmp, end, answer);
// 현재 이동할 가장 아래 원판을 제외한 n-1개의 원판에 대해 start에서 tmp로 이동해서 재귀 호출
answer[idx++] = new int[] {start, end};
// 가장 아래 원판을 start에서 end로 이동
hanoi(n-1, tmp, end, start, answer);
// n-1개의 원판을 tmp에서 end로 이동하는 재귀함수 호출
}
}
- 가장 아래에 있는 큰 원판을 start(1)에서 end(3)으로 이동하고, 나머지 n-1개의 원판에 대해 재귀함수를 통해 반복하는 구조이다.
즉, 가장 큰 원판 하나를 제외한 n-1개의 원판들은 tmp(2)에 임시로 두고 하나의 원판을 이동한 뒤, tmp에 있는 n-1개의 원판에 대해 다시 tmp에서 end로 이동하도록 하는 것이다. - 하노이의 탑 문제를 풀어봤다고 생각했는데 푼 적이 없어서 아이디어를 떠올리는 데 어려움을 느끼고 구글링을 통해 참고하였다.
특히 자바의 경우 파이썬과 달리 배열의 크기를 미리 알아야 하기 때문에 이동 횟수를 먼저 계산해줘야 한다.
백준 하노이 탑 문제에 대한 파이썬 풀이
[BOJ] 하노이 탑 | Python
문제 백준 1914번 하노이 탑 | 실버 1 https://www.acmicpc.net/problem/1914 1914번: 하노이 탑 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로
eunjng.tistory.com
'PROBLEM > PROGRAMMERS' 카테고리의 다른 글
[PRO] 둘만의 암호 | Java (0) | 2023.06.19 |
---|---|
[PRO] 택배 배달과 수거하기 | Python | Java (0) | 2023.06.18 |
[PRO] 숫자 게임 | Java | Python (0) | 2023.06.14 |
[PRO] 게임 맵 최단거리 | Java (0) | 2023.06.13 |
[PRO] 키패드 누르기 | Java (0) | 2023.06.12 |