갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • C# 예외 처리
  • 게임 디자인 패턴
  • C# boxing
  • 자바
  • 롤 골드그래프
  • 모바일 게임 순위
  • pc게임 순위
  • C++
  • C++ 소멸자
  • 게임매출순위
  • 유니티 그래프 그리기
  • C++ virtual
  • 유니티 골드그래프
  • 알고리즘
  • 유니티 그래프
  • c# 코루틴
  • pc 게임 순위
  • 게임 매출 순위
  • 전세계게임매출순위
  • c# unboxing
  • 전세계 게임 매출
  • c# delegate
  • 2020년 게임 매출
  • Unity Graph
  • c# Thread
  • C++ 상속
  • 글로벌게임매출
  • c# coroutine
  • c# collection
  • 강남 방탈출

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[자바] 하노이의 탑
프로그래밍/자바

[자바] 하노이의 탑

2018. 4. 3. 11:58
728x90
반응형

  하노이의 탑

 

하노이의 탑은 대표적인 퍼즐의 일종입니다. 세 개의 기둥이 있고 맨 왼쪽의 기둥에는 원판의 크기 순서대로 N개가 쌓여 있습니다.

이렇게 쌓여 있는 원판을 가장 오른쪽 기둥으로 모두 옮겨야 합니다.
단, 한 번에 원판을 하나씩 이동시킬 수 있고, 큰 원판을 작은 원판 위에 쌓을 수 없습니다.

 

N개의 원판은 총 2N -1 번의 과정을 거쳐 이동할 수 있습니다. 하지만 어떠한 과정으로 원판을 옮겨야 2N -1 번만에 옮길 수 있는지는 아직 모릅니다. 원판이 N개 있을 때, Hanoi 함수에서 어떠한 과정으로 2N -1 번만에 옮길 수 있는지 과정을 리턴하세요.

 

리턴값의 표기 방법은 다음과 같습니다.

  • 3개의 기둥은 순서대로 각각 1, 2, 3번으로 표기합니다.
  • 원판을 기둥1에서 기둥3으로 이동했다면 [1, 3]으로 표기합니다.
  • 원판을 기둥3에서 기둥1로 이동했다면 [3, 1]로 표기합니다.

이러한 이동 순서를 담는 배열을 리턴하면 됩니다. 예를들어 N이 2라면 아래 그림과 같이 옮길 수 있으므로

리턴값은 [ [1,2], [1,3], [2,3] ]입니다.

 


 

import java.util.Arrays;

class Hanoi {
  int count=0;
  public int[][] hanoi(int n) {
    int[][] answer = new int[(int)Math.pow(2, n)-1][2];
    answer = moveHanoi(1, 2, 3, n, answer);

    return answer;
  }
  
  public int[][] moveHanoi(int fi, int se, int th, int n, int[][] answer) {
    if(n==1) {
      answer[count][0]=fi;
      answer[count][1]=th;
      ++count;
    }
    else {
      moveHanoi(fi, th, se, n-1, answer);
      answer[count][0]=fi;
      answer[count][1]=th;
      ++count;
      moveHanoi(se, fi, th, n-1, answer);
    }
    return answer;
  }

 
 public static void main(String[] args) {
   Hanoi h = new Hanoi();
   System.out.println(Arrays.deepToString(h.hanoi(2)));
 }

}
728x90
반응형

'프로그래밍 > 자바' 카테고리의 다른 글

[자바] N개의 최소공배수  (0) 2018.04.04
[자바] 멀리 뛰기  (0) 2018.04.04
[자바] 숫자의 표현  (0) 2018.04.03
[자바] 시저 암호  (0) 2018.04.03
자바 String -> Int // string to int  (0) 2017.09.21
    '프로그래밍/자바' 카테고리의 다른 글
    • [자바] 멀리 뛰기
    • [자바] 숫자의 표현
    • [자바] 시저 암호
    • 자바 String -> Int // string to int
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바