코딩테스트/프로그래머스 level 3

[프로그래머스 level_3] 하노이의 탑 for JAVA

냠냠:) 2020. 4. 29. 15:49

https://programmers.co.kr/learn/courses/30/lessons/12946

 

프로그래머스

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

programmers.co.kr

[문제 설명]

 

하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대로 쌓여 있습니다. 게임의 목적은 다음 두 가지 조건을 만족시키면서, 한 기둥에 꽂힌 원판들을 그 순서 그대로 다른 기둥으로 옮겨서 다시 쌓는 것입니다.

  1. 한 번에 하나의 원판만 옮길 수 있습니다.
  2. 큰 원판이 작은 원판 위에 있어서는 안됩니다.

하노이 탑의 세 개의 기둥을 왼쪽 부터 1번, 2번, 3번이라고 하겠습니다. 1번에는 n개의 원판이 있고 이 n개의 원판을 3번 원판으로 최소 횟수로 옮기려고 합니다.

1번 기둥에 있는 원판의 개수 n이 매개변수로 주어질 때, n개의 원판을 3번 원판으로 최소로 옮기는 방법을 return하는 solution를 완성해주세요.

 

제한사항

  • n은 15이하의 자연수 입니다.

입출력 예

n result
2 [ [1,2], [1,3], [2,3] ]

입출력 예 설명

입출력 예 #1
다음과 같이 옮길 수 있습니다.

 

 

 

[풀이]

하노이의 탑을 재귀적으로 푸는 방법은 다음과 같다.

1. n-1개가 1번타워에서 2번타워로 움직인다.

 

2. n번 타워가 1번타워에서 3번타워로 움직인다.

3. n-1개의 타워가 2번타워에서 3번타워로 움직인다.

각 과정은 전체적인 매커니즘을 보여주는 것이다. 하지만 더 세부적인 단계를 들여다보면 n-1개의 탑들이 1번타워에서 2번타워로 건너갈 때 우리는 3번째 타워를 사용한다. 또한 n-1개의 탑들이 2번타워에서 3번타워를 거쳐갈 때 1번타워를 사용한다. 즉, 경유지점을 꼭 갖는다는 말이다.

 

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Hanoi {
    ArrayList<int[]> al;
    public void hanoi(int n, int from, int to, int IC) {
        if(n == 1) {
            al.add(new int[] {1,3});
            return;
        }else {
            hanoi(n-1, from, IC, to);
            al.add(new int[] {from,to});
            hanoi(n-1, IC, to, from);
        }
    }
    public int[][] solution(int n){
        al = new ArrayList<int[]>();
        hanoi(n,1,3,2);
        int[][] answer=  new int[al.size()][2];
        for(int i = 0; i < al.size(); i++) {
            answer[i][0]= al.get(i)[0];
            answer[i][1]= al.get(i)[1];
        }
        return answer;
        
    }
}
cs
프로그래머스 테스트 케이스 통과

 

느낀 점 : 아직도 하노이를 정확히 이해하지 못하고 있다. 얼추 이런 느낌이구나 하고 문제를 풀고, 코드를 이해하는 수준이지 하노이가 어떻게 세부적으로 동작하는지의 이해도는 상대적으로 떨어지는 것 같다. 앞으로 계속 보면서 공부해야겠고, 하노이를 이해해야지 재귀를 완전히 이해한다라는 말에 동의할 수 있게 공부해야겠다.

반응형