일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 큐
- 자료 구조
- 해시를 사용한 집합과 맵
- 다이나믹 프로그래밍
- 수학
- 임의 정밀도 / 큰 수 연산
- 정렬
- LeetCode 83번
- 재귀
- 구현
- 정수론
- 별 찍기
- Queue
- 시뮬레이션
- KMP알고리즘
- 연결리스트 중복제거
- 사칙연산
- 브루트포스 알고리즘
- 프로그래머스
- 연결리스트 정렬
- 조합론
- 문자열제곱
- 스택
- 실패함수
- 문자열
- LeetCode 83 c언어
- LeetCode Remove Duplicates from Sorted List in c
- 이분 탐색
- 유클리드 호제법
- 큰 수 연산
- Today
- Total
hahn
단계별로 풀어보기(재귀 - 하노이 탑 이동 순서) 본문
11729번: 하노이 탑 이동 순서 (acmicpc.net)
11729번: 하노이 탑 이동 순서
세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라 첫 번째 장대에서 세 번째 장대로
www.acmicpc.net
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int insertNumber = Integer.parseInt(br.readLine()),
moveCount = 1;
String[] beforeArr, printArr;
printArr = new String[1];
printArr[0] = "1 3";
for(int i = 1; i < insertNumber; i++) {
beforeArr = printArr;
moveCount *= 2;
moveCount ++;
printArr = new String[moveCount];
for(int j = 0; j < beforeArr.length; j++) {
printArr[1 + (j*2)] = beforeArr[j];
}
for(int j = 0; j < printArr.length; j +=2) {
if(i % 2 == 0) {
if(j % 6 == 0) printArr[j] = "1 3";
if(j % 6 == 2) printArr[j] = "3 2";
if(j % 6 == 4) printArr[j] = "2 1";
}else {
if(j % 6 == 0) printArr[j] = "1 2";
if(j % 6 == 2) printArr[j] = "2 3";
if(j % 6 == 4) printArr[j] = "3 1";
}
}
}
bw.write(String.valueOf(moveCount) + "\n");
for(int i = 0; i < printArr.length; i++) {
bw.write(printArr[i] + "\n");
}
bw.close();
}
}
다른 시험공부한다고 한동안 안 풀고 있다가
심심해서 한 문제 풀러왔다.
전에 문제 대충 읽고
하노이탑 원판 옮긴 횟수 구하는 식은 그냥 바로 구해놨는데
이동 순서는 바로 안 보여서 나중에 해야지 하고 다른 공부 했다.
대충 머리로 옮겨서 이동 순서를 적어놨는데
횟수는 그냥 * 2 하고 1 더해주면 됐다.
근데 저 순서가 문제였는데
오늘 조금 보니까
4, 5번째를 보면
4번째는 12 13 23
5번째는 13 12 32가
반복된다는 것을 알았는데
그 사이에 있는 것들을 수식화하기가 어려워서
다른 패턴을 찾아봤다.
String []에 순서 한 개(ex. 1 2)가 들어간다 가정하고
인덱스 번호가 1번부터 시작한다고 생각하면
다음 생성되는 배열에 자신의 인덱스 번호 2배에 해당되는 부분에
자신이 들어간다는 걸 알 수 있었고
남는 홀수 번의 배열에는
원판의 개수가 짝수 일 때는 12 23 31 순으로 들어가고
홀수 일 때는 13 32 21이 들어간다는 걸 확인할 수 있었다.
대충 생각하면 마지막 원판(n)이 13 되기 전에 2번에 n-1의 원판이 들어가 있어야 하는데
그 이동경로를 머리로 그려봤을 때 얼추 맞겠다 싶었다.
그래서 그냥 제출해보니 통과됐다.
별 찍기보다는 탑 쌓기가 쉬웠다 ㅋㅋㅋ
30분 정도 걸린 듯?
'코딩테스트 연습 > 백준(JAVA)' 카테고리의 다른 글
단계별로 풀어보기(브루트 포스 - 분해합) (0) | 2021.08.31 |
---|---|
단계별로 풀어보기(브루트 포스 - 블랙잭) (0) | 2021.08.31 |
단계별로 풀어보기(재귀 - 별 찍기 - 10) (0) | 2021.08.25 |
단계별로 풀어보기(재귀 - 피보나치 수 5) (0) | 2021.08.25 |
단계별로 풀어보기(재귀 - 팩토리얼) (0) | 2021.08.25 |