본문 바로가기

CS/알고리즘

하노이의 탑

어렵다... 어렵다... 어렵다... 하지만 내껄로 만들겠어

 

https://school.programmers.co.kr/learn/courses/30/lessons/12946?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

public class Test10272 {
    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(solution(2)));
    }

    static int[][] answer;
    static int count=0;
    public static int[][] solution(int n) {

        answer = new int[(int)Math.pow(2,n)-1][2];
        move(n,1,3);

        return answer;
    }

    public static void move(int num, int x, int y){ // 개수,원래위치,목표위치

        if(num>1) //중간으로 옮기기
            move(num-1,x,6-x-y);

        answer[count++] = new int[]{x,y};

        if(num>1)   // 목표위치로 옮기기
            move(num-1,6-x-y,y);

    }
}

 

하노이의 탑 문제 풀이)

n-1개 까지 중간으로 옮기는 것이 핵심 포인트.

ex. 원반이 4개일 때, 3개까지 중간으로 1,2,3번 원반을 옮겨주어야함.

그리고 1,2를 중간으로 또 이동시키고, 3을 목표지점으로 옮겨주어야함.


나는 move 메서드 내에서 answer 배열에 값을 넣고 싶었는데

 

이렇게 static 변수로 선언해두면 접근이 가능했다.

대신, 이때 index 번호를 설정할 변수도 같이 static으로 선언해두어야 해당 위치에 접근이 가능하더라.

 

이 부분을 해결못해서 처음에는 list로 풀었는데, static을 이용한 방법을 다른 스터디원의 코드를 보고 알게되었다.

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

윷놀이 문제, Map merge 메소드  (0) 2023.11.16
게임개발 구현 문제풀이(좌표값 이동)  (0) 2023.11.05
시간 계산하기(손코딩)  (0) 2023.10.20
재귀함수와 반복문의 차이점  (0) 2023.10.19
소수 구하기  (0) 2023.10.03